Aller au contenu

Serge

Membres
  • Compteur de contenus

    397
  • Inscription

  • Dernière visite

Tout ce qui a été posté par Serge

  1. 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
  2. Serge

    Comment je fais ?

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

    Comment je fais ?

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

    Excel toujours actif

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

    Excel toujours actif

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

    Comment je fais ?

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

    Autocad et Excel

    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.
  8. 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.
  9. 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) )
  10. 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.
  11. Serge

    Excel toujours actif

    (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]
  12. 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
  13. Euréka ! (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget l))) Serge
  14. 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
  15. Serge

    ARX

    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
  16. 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
  17. 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
  18. 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
  19. 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.)
  20. 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
  21. Serge

    kzako

    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
  22. 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
  23. Serge

    MVport pour AutoCAD 2004

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

    Express tools en fr

    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
×
×
  • 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é