Ahryman40k Posté(e) le 22 juillet 2004 Posté(e) le 22 juillet 2004 Bonjour,apparement il s'agit d'un forum reservé pour les questions sur le developpement d'ARX en C++. Si c'est bien le ca ( j'y vois pas beaucoup de post ... ), voici ma question : j'ai definie ma commande perso, a l'interieur de celle-ci, je fais des appels a acedCommand pour faire une edition d'attributs et aussi, exploser des entitées.Cela fonctionnait tres bien dans la version 2002 de cet ARX, bizarement, je n'arrive pas a faire fonctionner correctement cette fonction en 2004. Si quelqu'un a des idées ... NB: Je n'utilise pas le flag ACRX_CMD_TRANSPARENT, comme preciser dans la doc. Sa serait cool si ce forum se developpait, car ce genre de forum en fancais est plutot inexistant ... Bon courage ...
didier Posté(e) le 22 juillet 2004 Posté(e) le 22 juillet 2004 bonjour, bienvenue pour ton premier message,ta question est aussi compliquée que ton pseudo,il est vrai que ce forum existe et j'espère que tu vas obtenir une réponse,mais, malheureusement, c'est trop Pro pour moi.désolé Éternel débutant… Mon site perso : Programmer dans AutoCAD
Serge Posté(e) le 22 juillet 2004 Posté(e) le 22 juillet 2004 Salut, Ton acedCommand appelle quoi au juste: 1) une commande d'AutoLISP, 2) une commande arx native (faite via acedRegCmds->addCommand) ou 3) une comande de style ADS faite via acadDefun) ? 1) Commande AutoLISP, essaie Acad::ErrorStatus st = acDocManager->sendStringToExecute( pDoc, "MaCommande\n", false, true); 2) Command ARXC'est possible que ça fonctionne avec acedCommand mais c'est fragile (même du temps de 2002). En effet, les commandes ARX ne sont pas libérées de la pile et, comme te le montrerait la variable système CMDACTIVE, tu recevra un message d'erreur (je ne me souviens plus lequel, soit can't re-enter ..., soit recursive ... Pourquoi ne pas appeler la fonction directement. Exemple if (MaCommande != RTNORM) { acutPrintf"\n Morbleu, pas encore une erreur !"); return; } Si tu ne peux appeller la fonction directement, ni par le sendStringToExecute, penses à la forme ADS 3) Commande ADS static int funcload(){ int i; for (i = 0; i < ELEMENTS(func_table); i++) { if (!acedDefun(func_table.func_name, (short)i)) return RTERROR; } return RTNORM;} static int dofun(){ struct resbuf *rb; int val; /* Get the function code and check that it's within range. (It can't fail to be, but paranoia doesn't hurt.) */ if ((val = acedGetFunCode()) < 0 || val >= ELEMENTS(func_table)) { acdbFail(/*MSG2*/"Received nonexistent function code."); return RTERROR; } /* Fetch the arguments, if any. */ rb = acedGetArgs(); /* Call the handler and return its success-failure status. */ val = (*func_table[val].func)(rb); acutRelRb(rb); return val;} Avec ceci dans la boucle de acrxEntryPoint case AcRx::kLoadDwgMsg: funcload(); break; Et finalement ceci dans ton fichier .h static struct func_entry func_table[] = { {/*MSG00*/"MaCommande", MaCommande}, {/*MSG01*/"TaCommande", TaCommande}, {/*MSG02*/"SaCommande",SaCommande},}; /* Declarations of other local functions */int dofun (void);int funcload (void); Ce type de commande saura prendre le acedCommand et le sendStringToExecute. Serge
Ahryman40k Posté(e) le 22 juillet 2004 Auteur Posté(e) le 22 juillet 2004 Haaaa merci beaucoup ... je desespere de trouvez pourquoi sa ne fonctionne pas ! Donc en fait c'est en ARX que j'ai refais completement en Visual Studio 7, la structure de l'ARX a etait créé par l'assistant, les commandes sont donc enregistrées par une macro ACED_ARXCOMMAND_ENTRY_AUTO( ). Il s'agit de commande ARX natives donc, pas de LISP et pas d'acadDefun ! Lorsque j'appelle cette commande ainsi cree, j'initialise en fait un serveur COM EXE qui est une bibliotheque de composants mecaniques 2D, ainsi qu'une interface de communication. la bibliotheque fonctionne donc en parallele a AutoCAD et lorsque l'on decide d'inserer une piece, je recoit l'evenement d'insertion et j'insere alors dans le dessin des pieces parametriques ou des blocs avec attributs.Des options de configuration permettent d'editer les blocs avec attributs durant l'insertion et d'exploser le bloc. en fait pour editer les attributs, j'aurai voulu faire : acedCommand( RTSTR, "_eattedit", RTPICKS, myselection, RTNONE );et pour l'autre acedCommand( RTSTR, "_explode", RTPICKS, myselection, RTNONE ); ce genre de chose fonctionnait avant avec AutoCAD 2000/2000i/2002. Etant donné que cela n'a jamais fonctionné, je me suis rabattu sur l'utilisation de sendStringToExecute en passant le point ou etait positionné le bloc.Malheureusement dans le cas d'entitées supperposées, il existe parfois des problemes et la commande _eattedit prend en compte les mauvaises et l'edition deconne. Peut on passer un jeu de selection a sendStringToExecute ?? si oui comment ?? Sinon comment puis je m'arranger pour acedCommand fonctionne enfin. Je m'interroge sur le fait que l'insertion se deroule en fait en dehors d'un appellle de commande ... erreur de context ?? j'espere etre assez clair ...Merci pour tes conseil !
Serge Posté(e) le 22 juillet 2004 Posté(e) le 22 juillet 2004 Salut, Pour le explode, essaie ceci: AcDbBlockReference *pBlkRef AcDbObjectId ObjId; // Faire en sorte que le pointeur pointe sur ton bloc. // Faire des tests comme if (pBlkRef->isA() == AcDbBlockReference::desc()) ... if (acdbOpenAcDbEntity((AcDbEntity*&)pBlkRef, ObjId, AcDb::kForWrite) == Acad::eOk) { pBlkRef->explode(); pBlkRef->close(); } Pour eattedit, c'est plus compliqué puisqu'il n'existe pas, à ma connaissance, une fonction native et directe. Tu peux utiliser la fonction acedSSSetFirst pour pré-sélectionner le bloc avant d'envoyer ton acedCommand. Sinon, tu peux passer ce genre de chaine : (handent "a7"), où "a7" est un handle que tu composes dynamiquement. Ça donnerait ceci:acedCommand( RTSTR, "_eattedit", RTSTR, "(handent "a7"), RTNONE ); Pour ce qui est de l'ancienne compatibilité, il est possible que tu ais été chanceux. La variable SORTENTS détermine le mode de sélection des objets. Serge
Serge Posté(e) le 22 juillet 2004 Posté(e) le 22 juillet 2004 Tiens, l'éditeur transforme le code en smileys, AcDbEntity*&)pBlkRefse lit AcDbEntity * & ) pBlkRefmais sans les espaces Serge(en continuant à m'auto-répondre, je monte en grade. Dommage qu'il n'existe pas de ceinture fléchée.)
Invité Patrick Posté(e) le 22 juillet 2004 Posté(e) le 22 juillet 2004 Serge, tu peux désactiver les smileys en cochant la case à cocher "Désactiver les smileys", ceci, message par message. A propos de la ceinture fléchée, pour ceux qui se demanderaient ce que c'est, voici le lien que m'a transmis Serge.
Pako Posté(e) le 22 juillet 2004 Posté(e) le 22 juillet 2004 Youpi ! Je suis vraiment COOL de voir Serge Camiré sur ce forum. :thumbup:C'est vraiment un grand plus pour CADxp d'avoir Serge comme intervenant sur différents sujets. Bienvenue Serge ! :laugh: l'ACADien ! http://img124.exs.cx/img124/7999/start.gif
Serge Posté(e) le 22 juillet 2004 Posté(e) le 22 juillet 2004 J'oubliais une autre chose importante (je n'aurais pas pu dormir autrement, "ici un vrai smiley") Tu désires lancer une commande dans un call-back de réacteur, n'est-ce pas? Si oui, je suis surpris que tu n'aie pas eu de difficultés avant: En plus du SendStringToExecute, tu aurais droit à ceci: extern "C" int ads_queueexpr(const char*);// Note : ads_queueexpr n'est pas documenté// Il ne s'exécute pas lors de son appel mais lorsque toute la poussière est retombée.ads_queueexpr("(command \"_eattedit\" \"(handent \"a7\")\" \"\")\n"); ou ads_name sset;struct resbuf *pArglist; struct resbuf *result; // = NULL; acedSSGet("_L", sset);// Note: ci-dessous une version pickset, mais tu peux prendre le (handent...), RTSTRif ((pArglist = acutBuildList(RTSTR,"_eattedit",RTPICKS,sset,,0)) == NULL) {acutPrintf("\nError in buildlist");} if (acedInvoke(pArglist, &result) != RTNORM) { acutPrintf("\nacedInvoke of EATTEDIT did not work"); } acutRelRb(pArglist);acutRelRb(result); Finalement, pour ce qui est du (handent "a7"), tu pourrais alors prendre (entlast) tout simplement. Serge
Serge Posté(e) le 22 juillet 2004 Posté(e) le 22 juillet 2004 Pako,Je suis en train de rattrapper le temps perdu :-) À tous,Pour ceux qui se demande ce qu'est une ceinture fléchée, et bien le Bonhomme Carnaval en porte une. Qu'est-ce qu'un Bonhomme Carnaval direz-vous? C'est la mascotte du carnaval qui se tient dans la ville de Québec au début février, lorsque le mercure se transforme en supra-conducteur (ici, on dit qu'i fa frette). Pourquoi la ville de Québec direz-vous? Parce que j'y habite. Pourquoi habite-tu la ville de Québec direz-vous? Vous pourrez constater mon entrainement. J'ai un fils de 12 ans. Serge
didier Posté(e) le 23 juillet 2004 Posté(e) le 23 juillet 2004 salut à toutes et à tousà mon tour je viens te saluer Serge,on ne se connaît pas, mais via le serveur de news,j'ai souvent vu tes réponses,et aussi souvent constaté leurs véracités,donc merci de traverser l'océan, pour venir dégourdirles pauvres garçons que nous sommes. ;) ps: continue de t'auto-répondre, tu mérites la ceinture noire,qui ne tient compte que du nombre de post,faut pas se la péter, on est pas des cadors amicalement Éternel débutant… Mon site perso : Programmer dans AutoCAD
Ahryman40k Posté(e) le 23 juillet 2004 Auteur Posté(e) le 23 juillet 2004 Est-ce que j'avais dit qu'il y avait tres peu de post !!!???En fait, c'est plus reactif ici que sur adn !!! :D Bon je reviens a mes moutons !!c'est vrai que je me suis prie la tete avec des bricoles pour exploser mon block, y'a une fonction toute faite qui m'etait sortie de la tete ( faut pas trop collé aux vieux code !! ) :AcDbBlockReference::explodetoOwnerSpace(). Et sa corrige nickel 1 point sur les 2 !! Concernant l'edition des atrributs !!decidement, je pense que mes appels se situe dans un contexte qui ne me permette pas d'utiliser acedCommand ... :casstet: Donc j'ai vu que l'on pouvait faire ce genre de truc acedCommand( RTSTR, "_eattedit", RTSTR, "(handent "a7"), RTNONE ); (par contre je sais pas si sa fonctionne !! )Si y'a moyen de passer un handle ou un Id a travers sendStringToExecute, ca fera finalement ce que je veux !! Question a part, quand tu parles de :"Sinon, tu peux passer ce genre de chaine : (handent "a7"), où "a7" est un handle que tu composes dynamiquement" << Il s'agit bien du même handle que retourne AcDbObjectId::handle() ??? merci bien ;)
Serge Posté(e) le 23 juillet 2004 Posté(e) le 23 juillet 2004 Ahryman40k,Question a part, quand tu parles de :"Sinon, tu peux passer ce genre de chaine : (handent "a7"), où "a7" est un handle que tu composes dynamiquement" << Il s'agit bien du même handle que retourne AcDbObjectId::handle() ??? Presque, il faut faire une petite transfo: char HandleStr[255]; tonObject.getIntoAsciiBuffer(HandleStr); Didier,Merci
Ahryman40k Posté(e) le 26 juillet 2004 Auteur Posté(e) le 26 juillet 2004 Super sa marche genial !!! j'avais oublié que l"on pouvait faire ce genre de chose !!! :D Je te remercie Serge, ton aide a ete super precieuse !!!Merci pour tout :D
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant