Aller au contenu

ObjectARX 2004, utilisation de acedCommand


Ahryman40k

Messages recommandés

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 ...

 

 

Lien vers le commentaire
Partager sur d’autres sites

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é

 

Lien vers le commentaire
Partager sur d’autres sites

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 ARX

C'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

 

Lien vers le commentaire
Partager sur d’autres sites

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 !

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

Tiens, l'éditeur transforme le code en smileys,

 

AcDbEntity*&)pBlkRef

se lit AcDbEntity * & ) pBlkRef

mais 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.)

 

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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...), RTSTR

if ((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

 

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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égourdir

les 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

 

Lien vers le commentaire
Partager sur d’autres sites

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 ;)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité