-
Compteur de contenus
397 -
Inscription
-
Dernière visite
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par Serge
-
API AutoCAD Mechanical 2004
Serge a répondu à un(e) sujet de Ahryman40k dans ObjectARX/DBX, C++, .NET, RealDWG
Salut, Quand tu as créé le AcmPartRef, as tu fermé l'objet avant de lui transmettre les données? S'agit-il d'une copie? Voici une routine qui permet de créer un PartRef avec 4 champs (via CMapStringToString valueMap). Tu y trouveras une instruction pPartRef->close() à la fois si il y a création ou s'il y a copie. void createPartRef() { AutoCAD::ErrorStatus es; ads_point pt; if (acedGetPoint(0, "Point for AcmPartRef:", pt) != RTNORM) return; // convert point from UCS to WCS acdbUcs2Wcs(pt, pt, Adesk::kFalse); AcDbObjectId partRefId; CMapStringToString valueMap; valueMap.SetAt("NAME", "Name"); valueMap.SetAt("MATERIAL", "Gold"); valueMap.SetAt("NOTE", "MyNote"); valueMap.SetAt("VENDOR", "Me"); if(getDataFromUser(valueMap) != Acad::eOk) return; AcDbObjectId mainBom; CString mainBomName; AcDbObjectId targetId = AcDbObjectId::kNull; es = acmBomMgr->getBomTable(mainBom,mainBomName,targetId); acutPrintf("\ngetBomTable returned : es = %s",acadErrorStatusText(es)); Acm::ErrorStatus as; if(mainBom == AcDbObjectId::kNull) { // append partRef entity to model space AcmPartRef* pPartRef = new AcmPartRef(); if (!pPartRef) return; appendToBlock(pPartRef,partRefId); as = pPartRef->setSymbolDefaults(); pPartRef->setOrigin(asPnt3d(pt)); pPartRef->close(); es = acmBomMgr->createBomTable(mainBom,targetId); if(es != Acad::eOk) { acutPrintf("\ncreateBomTable failed : es = %s",acadErrorStatusText(es)); return; } es = acmBomMgr->setPartData(partRefId,valueMap); if(es != Acad::eOk) { acutPrintf("\nsetPartData returned : es = %s",acadErrorStatusText(es)); return; } } else { AcDbObjectId itemId; AcDbObjectIdArray refIds; refIds.append(partRefId); int nextNo; bool exists; es = dcgPartRefExists(mainBom,valueMap,exists,itemId); if(es != Acad::eOk) { acutPrintf("\ndcgPartRefExists fails : es = %s",acadErrorStatusText(es)); return; } if(exists) { AcmCObjArray references; AcDbIntArray numItemArray; acmBomMgr->getItemReferences(itemId,references,numItemArray); acutPrintf("\nGot %d references",references.length()); // Just get the first reference and copy it AcDbObjectIdArray* arr = references[0]; AcDbObjectId id = arr->at(0); AcDbObjectId newId; AcDbObject* pObj; copyPartRef(id,newId); acdbOpenObject(pObj,newId,AcDb::kForWrite); AcmPartRef* pPartRef = AcmPartRef::cast(pObj); if(pPartRef) { pPartRef->setOrigin(asPnt3d(pt)); } pObj->close(); } else { // append partRef entity to model space AcmPartRef* pPartRef = new AcmPartRef(); if (!pPartRef) return; appendToBlock(pPartRef,partRefId); as = pPartRef->setSymbolDefaults(); pPartRef->setOrigin(asPnt3d(pt)); pPartRef->close(); acutPrintf("\nPartRef with these data are not ine the BOM table yet"); dcgGetNextItemNumber(mainBom,nextNo); char itemNo[255]; sprintf(itemNo,"%d",nextNo); acutPrintf("\nGot %d %s as nextItemNo",nextNo,itemNo); es = acmBomMgr->createItem(itemId,mainBom,refIds,itemNo); acutPrintf("\ncreateItem returned : es = %s",acadErrorStatusText(es)); es = acmBomMgr->setPartData(partRefId,valueMap); } } } Serge -
Tramber, Lorsqu'il s'agit de fonction, on fait [Ctrl]+[Majuscule]+[Espace]. Je l'avais mentionné dans l'un des messages précédents. Serge
-
Tramber, L'Apropos sert à dévoiler les variables définies ou les fonctions disponibles. On la trouve dans la barre Vue: l'icône est un A entre parenthèses. Exemple d'utilisation: 1) On clique sur l'icône. 2) On tape string si on croit qu'une fonction contient le mot string. On clique sur Ok 3) Une liste s'affiche. Elle peut contenir une vingtaine de fonction. On en choisit une puis on clique sur l'icône ? pour afficher l'aide sur cette fonction. Malheureusement, j'aurais souhaité inclure une saisie d'écran pour mieux illustrer. Pour les (getxxx), je ne sais pas si c'est suite à un de mes messages. Si oui, on ne peut pas espionner une fonction (getxxxx). Par contre, on pourrait évaluer (itoa myVar) Serge
-
Wow, Je suis devenu ceinture orange :-) En passant, pour charger la librairie: (vl-load-com) (if (not excm-open) (progn (vlax-import-type-library :tlb-filename "C:\\Program Files\\Microsoft Office\\Office10\\EXCEL.EXE" ; olb file :methods-prefix "excm-" :properties-prefix "excp-" :constants-prefix "excc-" ) )) puis après, tu peux appeler (excp-put-visible ...) Serge
-
Salut, Je n'ai pas de problème. Par contre, j'utilise (excp-put-visible excelApp 1) et non (vla-put-visible excelApp 1). Est-ce que tu as importé la librairie (tlb)? Serge
-
Salut, Comme il y a 3 éléments dans cette conversation: 1) Pour les parathèses, il y a déjà eu de nombreuses réponses: soit un double-clic; soit des touches 2) Pour la vérication de la valeur d'une variable, on peut utiliser l'Espion (variable ou expression). Ceci est utile s'il y a peu de variables à vérifier. Si on veut un résultat ponctuel, on peut faire un double clic sur la variable (ou former une sélection) puis cliquer sur la deuxième icône de la barre 'Outils". L'icône affiche 2 parenthèses sur fond gris et une flèche vers le bas. On peut également taper le nom directement dans la Console. 3) Pour ce qui est de trouver le nom d'une variable ou d'une fonction, on peut demmander à Visual Lisp de compléter les mots pour nous. [CTRL]+[Espace] pour une chaine déjà inscrite dans l'une des fenêtres ouvertes et [CTRL]+[Majuscule]+[Espace] pour une fonction disponible dans l' "Apropos" Serge
-
Salut, À mon avis, apprendre la sémentique de Visual Lisp pour Excel est beaucoup plus compliquée que de le faire directement en VBA. Autre chose: AutoLISP est un langage à exécution séquentielle et sans support pour les erreurs (ou presque) sans si on définit *error*, ce qui entraine la fin de l'éxécution le cas échéant. Les possibilités de débogage sont nulles. En VBA, il existe des instructions pour trapper les erreurs et ne pas tout perdre. Par exemple: ON ERROR RESUME NEXT ou ON ERROR GOTO xxxx. Le plus débile est que je crois que les concepteurs de VB on voulu qu'on traite les erreurs non pas comme des erreurs mais comme des événements normaux.
-
Salut, Je ne conseille pas d'utiliser les fonction acet (acet vient dede AutoCad Express Tools) parce que: 1) celles-ci ne sont pas documentées et risque de changer d'une version à l'autre 2) elles imposent les Express Tools 3) Il existe toujours (ou presque) une alternative Vlisp. simple.
-
Encore moi, Je préfère utiliser les fichiers packagés pour: 1) les lsp et dcl, cela va de soi 2) les fichiers Ascii qu'on peut faire afficher facilement par vl-get-resource Exemple (on aura packager readme.txt au projet) : (defun print-readme () (princ (vl-get-resource "readme")) (princ) )
-
Le DOC, 1) Crée un hello.dvb avec la fonction Hello Sub hello() MsgBox "Hello World" End Sub 2) En VLisp, crée hello.lsp avec (defun c:hello () ;;; IMPORTANT. Le dvb sera chargé tout seul par le simple chargement du Vlx ;;; Pas besoin donc d'appeler vl-vbaload (vl-vbarun "hello") (princ) ) 3) Avec ton assistant, inclus le dvb et le lsp 4) Dans AutoCAD, charge le vlx puis tape hello. La boite de vba apparaitra. Note: je ne suis pas un fevent de ce choix. Ceci enlève beaucoup de clarté et rien ne garanti le bon fonctionnement s'il y a des références requises par le dvb ou son bon comportement en mode MDI.
-
(setq excelApp (vlax-get-or-create-object "Excel.Application")) (vla-put-visible excelApp 1) ... (vla-quit excelApp) (vlax-release-object excelApp) (setq excelApp nil) [Edité le 13/8/2004 par Serge]
-
ObjectARX 2004, utilisation de acedCommand
Serge a répondu à un(e) sujet de Ahryman40k dans ObjectARX/DBX, C++, .NET, RealDWG
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 -
Euréka ! (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget l))) Serge
-
Hum ! Mauvaise nouvelle. ARX se fait à l'aide de Visual Studio qui se vend 2500$ cdn (1500 euro). En plus de l'avoir, il faut savoir l'utiliser. Et ça demande du temps. Serge
-
Patrick_35, Je dirais même plus, c'est fait en C++, donc compilé. Et puis du VB c'est compilé, pas le VBA, ce qui fait que tous les fichiers DVB se déverouillent. Serge
-
Cachez ces objets que je ne saurais voir...
Serge a répondu à un sujet dans ObjectARX/DBX, C++, .NET, RealDWG
Patrick, Pas besoin d'Arx pour cela. De façon temporaire: (redraw object 2) De façon permanente: (vla-put-Visible (vlax-ename->vla-object (entlast)) 0) ou en jouant sur le code dxf 60 À quoi ça sert? Imaginez que vous l'utilisez avec des groupes. Il suffit de faire le tour des objets du groupe pour tout allumer ou tout éteindre. Et bien d'autres... Serge -
ObjectARX 2004, utilisation de acedCommand
Serge a répondu à un(e) sujet de Ahryman40k dans ObjectARX/DBX, C++, .NET, RealDWG
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 -
ObjectARX 2004, utilisation de acedCommand
Serge a répondu à un(e) sujet de Ahryman40k dans ObjectARX/DBX, C++, .NET, RealDWG
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 -
ObjectARX 2004, utilisation de acedCommand
Serge a répondu à un(e) sujet de Ahryman40k dans ObjectARX/DBX, C++, .NET, RealDWG
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.) -
ObjectARX 2004, utilisation de acedCommand
Serge a répondu à un(e) sujet de Ahryman40k dans ObjectARX/DBX, C++, .NET, RealDWG
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 -
Salut, Voici une réponse quelque peu tardive (décalage horaire :-) La principale différence entre un programmeur Arx et de Lisp est que le premier est d'abord un programmeur qui s'intéresse à AutoCAD, souvent d'assez loin, tandis que l'autre est un AutoCADien qui s'intéresse à la programmation, souvent se rendant au niveau du VBA. Très rare sont ceux qui sont spécialistes des 2 mondes. Serge
-
ObjectARX 2004, utilisation de acedCommand
Serge a répondu à un(e) sujet de Ahryman40k dans ObjectARX/DBX, C++, .NET, RealDWG
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 -
Bonjour, Voici un extrait de ce qu'on retrouve à l'adresse http://www.cadnovation.com/fr/produits.html Espace papier / Espace objet de la façon la plus naturelle Développé par l'équipe de CAD-Novation, l'application MVPort pour AutoCAD simplifie de façon spectaculaire la gestion de la mise en page et de la normalisation des dessins. Un objet personnalisé - le MVPort - projette la silhouette d'une fenêtre flottante depuis l'espace papier (Paper space) vers l'espace objet (Model Space). Cet objet est dit "pro-réactif", c'est-à-dire que l'utilisateur peut l'agrandir, le déplacer ou le tourner et provoquer, en temps réel, des opérations équivalentes au ZOOM XP, au PAN et à la rotation de la vue. ------ On peut télécharger la beta pour 2004 à partir de ce lien http://www.cadnovation.com/2004_beta/ Je n'ai eu le temps que pour la version anglaise pour l'instant, la version française sera disponible très très prochainement. Entre temps, on peut essayer la version 2000-2002 maintenant. Le lien pour le téléchargement est http://www.cadnovation.com/fr/formulaire.html Sur le même site, on y trouve des témoignages, des freebies, de l'information sur notre compagnie, etc. Serge Camiré Cad-Novation, division de Consultants Univers inc.
-
Je viens d'installer une version française 2004 mais les Express Tools sont en anglais pour l'instant, à moins que je n'ais installé les freedom tools. :D
