PDA

Voir la version complète : commencer un projet de programmation sous C4D en lien avec une base de données



romain
07/11/2011, 00h43
Bonjour à tous et à toutes, je suis nouveau dans ce forum et novice en C4D. Je découvre ce site et je vous félicite pour la qualité des infos que l'on peut y trouver. Je travaille dans le domaine du paysage et je souhaite utiliser C4D dans cet objectif.

Je cherche à réaliser un import d'objets (points) provenant d'une base de données et les remplacer par des objets 3D (arbres) sous C4D. Dans cette base de données figure les coordonnées XYZ de chacun des points. Un ami avec qui je travaille sur ce projet est programmeur dans un tout autre domaine que le graphisme; il me propose de réaliser çà en (C++, objective-C), cependant il aurait besoin des API de C4D pour pouvoir l'interfacer.

Savez vous si l'on peut se procurer ces API et pensez vous que c'est une démarche qui peut aboutir? ou faut-il se tourner vers le SDK et réaliser des plugins ou autres avec un autre langage de programmation (python) ? .

j'espère avoir été clair et ne pas avoir fait trop d'erreurs dans les termes employés.

merci de vos réponses

valkaari
07/11/2011, 01h03
Bonjour,

Pour ce qui est de la programmation, les seuls trucs dispo sont LA (http://www.maxon.net/index.php?id=157&L=0)
Pour les questions de ce type tu as aussi ce forum (http://www.plugincafe.com/forum/default.asp)

Donc il faudrait utiliser le SDK et faire un plugin. Mais attention, il y a beaucoup de type de plugins. Tu peux très bien créer un plugins d'import de type de fichier personnaliser qui seront en fait une extraction de ta base de données.
Ou alors effectivement, directement communiquer avec la base. Dans ce cas, tu peux faire un plugin de type "Command" qui te permettra d'avoir une fenêtre pour choisir tes paramètres pour chercher dans la base et générer tes arbres.

Le plugin command peut aussi générer des plugins de type "object" qui pourrait te permettre de modifier le type d'arbre, le nombre, une probabilité d'existence ou pas.

Bref il y a plusieurs possibilités.

Le seul problème dans c4d c'est la création d'interface perso. Si tu veux créer tes propres éléments, ça devient vite très pénible quand c'est pas tout simplement impossible. (mais les possibilités restent nombreuses hein)


Bref, il faudrait déjà que tu précises un tout petit peu comment tu imagines l'utilisation de ton outils pour qu'on puisse t'aiguiller sur les bons terme.

voili voilà


edit :
tu peux utiliser python ou c++ uniquement.

romain
07/11/2011, 09h47
Bonjour valkaari et merci pour ta réponse:
Voilà quelques précisions:

L’idée à terme est bien de pouvoir communiquer avec la base de données. Cette base de données étant mise à jour régulièrement par des inventaires de terrain.
L’objectif du plug, est de permettre l’import des points dans C4D et de les transformer en objets (instances?) La représentation de l'object se baserait sur un champ (ou plusieurs) définit dans la BD. ex essence d'arbre (érable, frêne, tilleul etc) et de lui appliquer une symobologie prédéfinie (objet 3d Tilleul,erable etc...) dans une bibliothèque que je suis en train de construire. Dans un second temps, la taille de l’arbre 3D se baserait également sur la taille de l’arbre réel (éléments définit également dans la BD).
Faire du code pour lire et interpréter la BD ne semble pas être un gros problème, la partie que nous ne maîtrisons pas encore concerne la création des objets (instances) dans C4D et le lien avec une bibliothèque prédéfinie.
Si tu connais des exemples de plug-in qui ressemble de près ou de loin à ça, je suis preneur! Sinon je vais commencer à éplucher les liens que tu m’as transmis et je ne manquerai pas de vous tenir informé de l'avancée de mes travaux.

oli_d
07/11/2011, 10h11
Salut romain,

je travaille également dans le domaine du paysage et je développe ce type d'outils.

Je pense que même un "simple" script python pourrait faire amplement l'affaire. Si tu m'envoie par MP un exemple de ta base de données en format texte je peux te donner un exemple de code source qui pourra faire gagner du temps à ton collègue.

Si il veux vraiment se lancer dans le SDK en c++ il faut charger la doc chez Maxon, ce qui vaut également pour le python (http://www.maxon.net/fr/support/plugin-cafe.html) Ensuite il y a deux trois posts sous la rubrique programmation du forum où il y a des exemples.

Pour info je développe actuellement ce type de chose mais en lisant directement des formats de fichier de sig (systèmes d'information géographique) qui permettent justement de lier des données géométriques (spatiale) à des données alpha-numériques.

oli_d
09/11/2011, 04h33
ci-dessous un exemple de script python testé uniquement sur mac et sur la R13 de c4d (edit: fonctionne sur r12 mac également)

Le code est à coller dans le gestionnaire de script du menu script (r13, pour r12 menu python) puis exécuter, et choisir le fichier .txt.
Il génère un objet neutre contenant les instances, et un autre dans lequel il n'y a plus qu'à glisser un arbre source (il faut qu'il fasse 10m de haut pour que l'échelle des instance soit bonne).
Les données sont stockées sous forme de données utilisateur pour chaque instance (attention tout est en format texte, les nombres ne sont pas utilisables tel quel, c'est juste pour l'exemple)

Si questions -> 3615 code oli_d



import c4d
from c4d import gui

"""script pour l'import de donnees depuis un fichier texte avec separations tabulateurs
teste sur mac avec un fichier type :
ObjectID NOM_BOTA NOMVOIE HAUTEUR coord_x coord_y
27966 Acer negundo ALL GRANDE 6 884102.479 119124.068
27967 Acer negundo ALL GRANDE 9 884202.579 119224.068
"""

ORIGINE = c4d.Vector(884000,0,119000)

#constantes pour la position des differents champs
#attention le premier champ = 0

CHAMP_NOM =1

CHAMP_POS_X = 4
CHAMP_POS_Y = 5

CHAMP_HAUTEUR = 3


def lire_fichier(chemin):
f=open(chemin,"r")

#recuperation de la ligne des noms des champs
test = f.readline()
noms = test.split('\t')

#creation de l'objet neutre contenant les instances
res = c4d.BaseObject(c4d.Onull)
res.SetName('instances')
line = f.readline()

#creation d'un objet neutre pour la source des instances
srce = c4d.BaseObject(c4d.Onull)
srce.SetName('source')

#lecture de toutes les lignes
while line:
lst = line.split('\t')
#pour chaque ligne on cree un objet instance
obj= c4d.BaseObject(c4d.Oinstance)

#exemple pour assigner chaque valeur sous forme de donnee utilisateur
for i,v in enumerate(lst):
bc = c4d.GetCustomDatatypeDefault(c4d.DTYPE_STRING) #create default container
bc[c4d.DESC_NAME] = noms[i] #rename the entry
element = obj.AddUserData(bc) #add userdata container
obj[element] = v #assign a value

#exemple pour renommenr chaque instance par le nom de l'arbre
obj.SetName(lst[CHAMP_NOM])

#exemple pour positionner l'instance
pos = c4d.Vector(0)
pos.x = float(lst[CHAMP_POS_X])
pos.z = float(lst[CHAMP_POS_Y]) #attention dans c4d la hauteur est en Y
obj.SetAbsPos(pos - ORIGINE) #vaut mieux centrer les objet dans la scene
#en coordonnees normales c'est un peu dur a gerer dans C4D

#exemple pour regler l'echelle en partant du principe que l'arbre source fait 10 m de haut
scale = c4d.Vector(float(lst[CHAMP_HAUTEUR])/10)
obj.SetAbsScale(scale)


#definition de l'objet source de l'instance
#[c4d.INSTANCEOBJECT_LINK] est obtenu en faisant glisser le champ de l'objet en question dans l'editeur de script
obj[c4d.INSTANCEOBJECT_LINK] = srce

#insertion de l'instance dans notre objet neutre principal
obj.InsertUnder(res)

line = f.readline()

f.close()

#insertion des deux objets neutres dans le document
doc.InsertObject(srce)
doc.InsertObject(res)

c4d.EventAdd()


if __name__=='__main__':
chemin = c4d.storage.LoadDialog()
lire_fichier(chemin)
#fonction pour rafraichir l'affichage
c4d.EventAdd()