PDA

Voir la version complète : Supprimer les n-gones



César Vonc
01/07/2013, 00h29
Bonsoir,

J'ai actuellement un soucis pour supprimer des n-gones en Python. J'ai essayé la commande ID_NGON_REMOVE_MENU dans tous les sens, mais rien, elle veut pas. :icon_banghead:


import c4d

def main():
print c4d.utils.SendModelingCommand(command = c4d.ID_NGON_REMOVE_MENU,
list = [op],
mode = c4d.MODELINGCOMMANDMODE_POLYGONSELECTION,
doc = doc)

if __name__=='__main__':
main()


Est-ce que ça vient de moi ou ça ne marche pas non plus chez vous ?

xs_yann
01/07/2013, 10h56
Salut César,

Pareil chez moi, en COFFEE aussi et en R12 aussi.

J'ai vu que tu avais ouvert un thread sur plugincafe, peut-être que quelqu'un aura une réponse là-bas.
Sinon tu peux bidouiller avec un CallCommand mais c'est pas très pratique ni propre...

Bon courage. ;)

César Vonc
01/07/2013, 21h37
En effet, ça marche avec la fonction CallCommand() mais comme tu dis ce n'est pas terrible, il inclue une sorte de AddUndo() qui oblige à faire deux fois Ctrl+Z pour annuler mon script, du coup. : /

Pas de nouvelles du côté de plugincafé, hélas !

xs_yann
01/07/2013, 23h49
Tu peux peut-être créer un nouveau document pour faire ton CallCommand dedans ça devrait t'éviter l'undo...

valkaari
01/07/2013, 23h55
je t'aurais bien dit d'utiliser la librairie de modélisation, mais elle n'existe pas en python, uniquement dans le sdk c++

César Vonc
02/07/2013, 11h04
Pas grave, je vais me débrouiller avec le CallCommand().



Tu peux peut-être créer un nouveau document pour faire ton CallCommand dedans ça devrait t'éviter l'undo... Ah pas bête ! Cela semble fonctionner avec ce bout de code, j'espère avoir fait les choses dans le bon ordre :



doc2 = doc.GetClone()
c4d.documents.SetActiveDocument(doc2)
c4d.CallCommand(c4d.ID_NGON_REMOVE_MENU)
obj2= doc2.GetActiveObject()

c4d.documents.SetActiveDocument(doc)
obj2.InsertAfter(obj)
doc.AddUndo(c4d.UNDO_NEW, obj2)

c4d.documents.KillDocument(doc2)

doc.AddUndo(c4d.UNDOTYPE_DELETE, obj)
obj.Remove()

César Vonc
03/07/2013, 00h40
Rah zut, c'est bien de le faire dans un autre doc, mais si l'objet a des matériaux, ils passent à la trappe lors de son retour au doc d'origine.

J'ai commencé à faire une sorte de retranscription des mats, mais c'est vite devenu une usine à gaz...


Je vais voir ce que ça donne avec l'outil couteau, mais je n'y crois pas vraiment.

oli_d
03/07/2013, 08h33
Ça à l'air de marcher si on remet un clone de l'objet dans le nouveau document



doc2 = doc.GetClone()
doc2.InsertObject(obj.GetClone())
c4d.documents.SetActiveDocument(doc2)
c4d.CallCommand(c4d.ID_NGON_REMOVE_MENU)
obj2= doc2.GetFirstObject()

c4d.documents.SetActiveDocument(doc)
obj2.InsertAfter(obj)
doc.AddUndo(c4d.UNDO_NEW, obj2)

c4d.documents.KillDocument(doc2)

doc.AddUndo(c4d.UNDOTYPE_DELETE, obj)
obj.Remove()

César Vonc
03/07/2013, 10h00
Aahh oui en effet ! Merci Oli_D ! ^^

Je précise aussi qu'il vaut mieux définir le mode polygones du nouveau doc avant la de lancer commande (une autre ânerie qui m'a fait perdre bien du temps).


doc2 = doc.GetClone()
doc2.InsertObject(obj.GetClone())
c4d.documents.SetActiveDocument(doc2)
doc2.SetMode(c4d.Mpolygons)
c4d.CallCommand(c4d.ID_NGON_REMOVE_MENU)
obj2= doc2.GetFirstObject()

c4d.documents.SetActiveDocument(doc)
obj2.InsertAfter(obj)
doc.AddUndo(c4d.UNDO_NEW, obj2)

c4d.documents.KillDocument(doc2)

doc.AddUndo(c4d.UNDOTYPE_DELETE, obj)
obj.Remove()

Sinon, il y a une autre commande qui me semble intéressante mais dont je ne trouve pas le nom d'origine : il s'agit de la commande Connecter (ID 440000042), qui permet, en mode points, de créer une arête entre deux sommets.

Comment vous faites pour trouver le nom d'une commande en ne connaissant que son numéro d'ID ? : P

valkaari
03/07/2013, 13h43
tu fais une recherche de fichiers ayant pour contenu ton numéro d'IDs

en général tu fini par trouver le fichier et à la bonne ligne le nom de la variable.

il y a beaucoup de commande déclaré dans le fichier ge_prepass.h qui se trouve dans le répertoire ressources/_api

César Vonc
03/07/2013, 16h40
Pour 440000042, il ne m'a trouvé que resource\icons\interface_icons.txt contenant 440000042 // Connect component tool.

Encore une de ces commandes mystère déclarée nulle part et qui n'est pas dans la doc.



D'autre part, j'ai essayé la commande trianguler et celle pour convertir en quadrangles, mais le maillage est nettement moins joli.


Mais bon tant pis, je vais me débrouiller avec le CallCommand(), ça marche, c'est déjà ça.

xs_yann
04/07/2013, 09h58
J'avais expliqué un peu comment retrouver une constante en ne connaissant que l'id ici : http://frenchcinema4d.fr/showthread.php?75724-modifier-les-reglages-de-Vray-en-python&p=1002012&viewfull=1#post1002012


import c4d

def print_const(id):
for key in dir(c4d):
value = getattr(c4d, key)
if value == id:
print "%s = %s\n" % (key, value)

def main():
print_const(1016174)


if __name__=='__main__':
main()


Mais ça arrive que des commandes, objets, etc, ne soient pas répertoriés ; dans ce cas je déclare la constante moi même au début de mon code.