-
Compteur de contenus
5 029 -
Inscription
-
Dernière visite
-
Jours gagnés
56
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par bonuscad
-
Choisir quelle lettre taper lors d'une selection
bonuscad a répondu à un(e) sujet de Red dans Débuter en LISP
Bonjour, J'espère que tu comprend l'anglais, une page vers la documentation INIGET Voir surtout le bas de page. Autrement un exemple pour tester. ((lambda ( / ) (initget "Père Mère filS fillE _Father Mother Son Daugther") (while (setq cle (getkword "\nChoisir lien parental [Père/Mère/filS/fillE]?: ")) (princ cle) (initget "Père Mère filS fillE _Father Mother Son Daugther") ) (prin1) )) Les 2 options du fils et de la fille peuvent t'éclairer sur le rôle des majuscules -
Polyligne avec largeur personnalisable et texte centré
bonuscad a répondu à un(e) sujet de Red dans LISP et Visual LISP
Laisse tomber les options linguistique pour le moment... en ligne de commande: .-CALQUE est exactement la même commande que _.-LAYER Pour l'instant retient juste l'usage du tiret "-" pour avoir les options en ligne commande. Ce tiret n'est pas indispensable dans le code. Pour te le prouver fait (command "calque") en ligne de commande, tu verras que tu auras la même chose que si tu avais fait -calque directement en ligne de commande. (setvar "PLINEWID" "0") attention pas de guillemets supplémentaire... doit être fait AVANT d'utiliser (command "polylign" ....). Bien sur ne pas utiliser les options Demi-larg/LArgeur dans polylign qui annihilerait la variable PLINEWID défini précédemment car ces option changent elles même la valeur de PLINEWID. L'attitude à adopter serait de sauvegarder la valeur de PLINEWID dans une variable. Exemple (setq oldplwid (getvar "PLINEWID")) (setvar "PLINEWID" 0.12) (command "polylign" ....) (setvar "PLINEWID" oldplwid) -
Polyligne avec largeur personnalisable et texte centré
bonuscad a répondu à un(e) sujet de Red dans LISP et Visual LISP
Dans le tout premier code que tu as poster tu as utiliser _.offset pour decaler, donc je suis resté dans la même optique. Cette syntaxe avec l'underscore "_" permet d'internationaliser ton code, c'est à dire qu'il pourra fonctionner sous n'importe quelle version linguistique d'Autocad (anglaise, allemande, française, etc...). Sans il ne fonctionnera QUE sous une version française. Quant au point ".", c'est juste une sécurité d'utiliser la commande NATIVE. En effet avec la commande REDEF on peut redéfinir une commande pour qu'elle fasse autre chose. C'est peu utilisé, mais ça existe! Donc c'est une bonne habitude mais pas obligatoire, ça complique l'écriture car il faut connaitre les commandes ET les options en Anglais. (Il y a une astuce publié pour avoir cette traduction) Il y a aussi une astuce pour les commandes qui lance une boite de dialogue. Au lieu de taper CALQUE en ligne de commande, tu tape -CALQUE L'effet du tiret "-" et de désactiver la boite de dialogue et tu vois toutes les options en ligne de commande. -
Polyligne avec largeur personnalisable et texte centré
bonuscad a répondu à un(e) sujet de Red dans LISP et Visual LISP
Non du tout! Ta boucle fonctionnait très bien, tu peux la conserver. Je voulais juste te montrer une façon plus concise avec la variable CMDACTIVE qui t'évite d'utiliser une variable pt pour l'acquisition avec (getpoint) pour la soumettre à nouveau à pline. Ta grosse erreur était dans (command "_chprop" (entlast) "" "_la" SRMV_Bordure_A1_AVANT ""), tu as oublier de quoter en chaine avec les guillemets "", donc pour autocad c'était une variable (par défaut à nil, puisque pas déclarée) et non pas une chaine représentant un nom de calque. J'ai supprimer aussi (setq ent (car (entsel))) et (command "_.pedit" (entlast) "la" EP "") qui était inutile ou redondant. pour tester CMDACTIVE: tape en ligne de commande Commande: (getvar "cmdactive") -> 0 (aucune commande active) refais la même chose, mais avec _.pline ou autre chose Commande: _.PLINE Spécifiez le point de départ: (getvar "cmdactive") ->1 (une commande est active) Pour info, les valeurs possible de CMDACTIVE (dans l'aide) Indique si une commande ordinaire, une commande transparente, un script ou une boîte de dialogue est actif. (Lecture seule) Type : Entier Enregistré dans : Pas enregistré Valeur initiale : Varie Le paramètre est stocké sous forme de code binaire en utilisant la somme des valeurs suivantes : 0 Aucune commande active 1 Une commande ordinaire est active. 2 Une commande transparente est active. 4 Un script est actif. 8 Une boîte de dialogue est active. 16 DDE est actif. 32 AutoLISP est actif (visible uniquement pour une commande définie par ObjectARX ) 64 Une commande ObjectARX est active -
Polyligne avec largeur personnalisable et texte centré
bonuscad a répondu à un(e) sujet de Red dans LISP et Visual LISP
Bonjour, Bon début! Je t'apporte les corrections essentielles sans changer la philosophie de ta démarche de façon à ce que ton code fonctionne. Je te laisse observé les différences pour comprendre. Si tu as des questions n'hésite pas! (defun c:borax ( / REP DC) (setvar "OSMODE" 6) (initget "A1 A2") (setq REP (getkword "\nType de bordure [A1/A2] <A1> : ")) (if (not rep) (setq rep "A1") ) (if (not (tblsearch "LAYER" "SRMV_Bordure_A1_AVANT")) (command "_.layer" "_new" "SRMV_Bordure_A1_AVANT" "") ) (if (not (tblsearch "LAYER" "SRMV_Bordure_A1_ARRIERE")) (command "_.layer" "_new" "SRMV_Bordure_A1_ARRIERE" "") ) (prin1 "\nCliquer le parcour de votre réseau <Taper (Return) pour FIN>") (command "_.pline" pause "_width" 0.02 0.02) (while (not (zerop (getvar "CMDACTIVE"))) (command pause) ) (command "_.chprop" (entlast) "" "_layer" "SRMV_Bordure_A1_AVANT" "") (cond ((= REP "A1") (setq DC 0.2) ) ((= REP "A2") (setq DC 0.15) ) ) (command "_.offset" DC (entlast) pause "") (command "_.chprop" (entlast) "" "_layer" "SRMV_Bordure_A1_ARRIERE" "") (prin1) ) PS: utilise la balise code "<>" du forum pour poster ton code, avec l'indentation c'est plus facile à lire. -
Valeur initial d'un attribut qui modifie d'autre attirbuts
bonuscad a répondu à un(e) sujet de Flobott dans AutoCAD 2016
"entmake" que l'on pourrait comprendre "entities make" -> Créer une entité/objet Elle permet de créer directement dans la base de données (sans passer par l'interface graphique) un objet du dessin (une ligne, un cercle, un calque, un style de texte etc..) C'est le substitut de la commande de création d'objet que tu lance a travers la ligne de commande, palette, menu. L'avantage est la rapidité d'exécution et que tu t’affranchis de contrôler l'environnement du dessin actuel (état des variables qui peuvent avoir une influence lorsque tu utilise les commandes natives.) car j'aurais pus utiliser par exemple (command "ligne" '(0.0 0.0 0.0) '(1.0 5.0 0.0) "") A la différence est qu'avec command la ligne aurait été crée dans le calque courant. Il aurait fallu que j'utilise avant (command "calque"...) avec les bonnes options pour me positionner comme il faut, avec entmake tout est fixé dans la liste soumise à l'exécution. La liste soumise est pratiquement identique à la liste retournée par la fonction (entget (car (entsel))) (choisir un objet dessiné.) J'ai fais cela, mais j'aurais pu joindre un DWG à la place de faire des entmake :(rires forts): Mais là pas de pièce jointe, tout est dans le code! (entmake) est la méthode de création depuis qu'autolisp existe. Depuis il y a d'autre méthode (vla-add[type d'objet à créer] ....). Personnellement j'utilise les deux, elles ont chacune leur avantages/inconvénients. -
Valeur initial d'un attribut qui modifie d'autre attirbuts
bonuscad a répondu à un(e) sujet de Flobott dans AutoCAD 2016
Comme suggéré, le lisp peut enlever cette barrière. Je te donne un code en exemple et comme j'ai voulu faire un exemple qui fonctionne (même dans un nouveau dessin vierge), il peut sembler complexe car je fabrique tout (du bloc aux insertions) par (entmake) mais en fait la partie intéressante est celle-ci: (foreach a (vlax-invoke (vlax-ename->vla-object (entlast)) 'GetAttributes) (cond ((= (vla-get-TagString a) "X0") (setq val_tagX (vla-get-TextString a) id_att (vla-get-ObjectID a) ) ) ((= (vla-get-TagString a) "X1") (vla-put-TextString a (strcat "%<\\AcExpr (1+" "%<\\AcObjProp Object(%<\\_ObjId " (itoa id_att) ">%).TextString>%" ")>%" ) ) ) ) ) Pour toi, il peut être très simple d'utiliser la commande inserer (donc sans utiliser entmake) dans le lisp avec ton propre bloc et de prendre la suite donnée ci dessus. (il faut juste veiller à prendre la bonne valeur d'étiquette "X0" et "X1") LE LISP DE TEST (defun make_blk_bornier ( / ) (if (not (tblsearch "STYLE" "$BLK_BORNIER")) (entmake '( (0 . "STYLE") (5 . "40") (100 . "AcDbSymbolTableRecord") (100 . "AcDbTextStyleTableRecord") (2 . "$BLK_BORNIER") (70 . 0) (40 . 0.0) (41 . 1.0) (50 . 0.0) (71 . 0) (42 . 0.1) (3 . "ARIAL.TTF") (4 . "") ) ) ) (if (not (tblsearch "BLOCK" "BORNIER")) (progn (entmake '( (0 . "BLOCK") (8 . "0") (2 . "BORNIER") (70 . 2) (4 . "") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (10 0.0 0.0 0.0) ) ) (entmake '( (0 . "LWPOLYLINE") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (100 . "AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 -0.5 -0.5) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 0.5 -0.5) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 0.5 0.5) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 -0.5 0.5) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0) ) ) (entmake '( (0 . "ATTDEF") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (100 . "AcDbText") (10 -0.170873 0.209209 0.0) (40 . 0.2) (1 . "1") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "$BLK_BORNIER") (71 . 0) (72 . 1) (11 0.0 0.15 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttributeDefinition") (280 . 0) (3 . "valeur initial") (2 . "X0") (70 . 0) (73 . 0) (74 . 1) (280 . 1) ) ) (entmake '( (0 . "ATTDEF") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) (100 . "AcDbText") (10 -0.170873 -0.35 0.0) (40 . 0.2) (1 . "") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "$BLK_BORNIER") (71 . 0) (72 . 1) (11 0.0 -0.15 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttributeDefinition") (280 . 0) (3 . "X0+1") (2 . "X1") (70 . 0) (73 . 0) (74 . 3) (280 . 1) ) ) (entmake '( (0 . "ENDBLK") (8 . "0") (62 . 0) (6 . "ByBlock") (370 . -2) ) ) ) ) ) (defun c:bornier ( / pt_ins scal_ins ang_ins value_tag val_tagX id_att) (if (not (tblsearch "BLOCK" "BORNIER")) (make_blk_bornier) ) (initget 9) (setq pt_ins (getpoint "\nPoint d'insertion du bloc bornier?: ")) (initget 6) (setq scal_ins (getdist pt_ins "\nEchelle d'insertion du bloc? <1>: ")) (if (not scal_ins) (setq scal_ins 1.0)) (setq ang_ins (getangle pt_ins "\nAngle d'insertion du bloc? <0>: ")) (if (not ang_ins) (setq ang_ins 0.0)) (setq ang_ins (+ ang_ins (angle '(0 0 0) (getvar "UCSXDIR")))) (initget 1) (setq value_tag (getint "\nValeur Entière de l'attribut?: ")) (entmake (list (cons 0 "INSERT") (cons 100 "AcDbEntity") (cons 67 (getvar "TILEMODE")) (cons 410 (getvar "CTAB")) (cons 8 (getvar "CLAYER")) (cons 100 "AcDbBlockReference") (cons 66 1) (cons 2 "BORNIER") (cons 10 (trans pt_ins 1 0)) (cons 41 scal_ins) (cons 42 scal_ins) (cons 43 scal_ins) (cons 50 ang_ins) (cons 210 (trans '(0 0 1) 1 0 T)) ) ) (entmake (list (cons 0 "ATTRIB") (cons 100 "AcDbEntity") (cons 67 (getvar "TILEMODE")) (cons 410 (getvar "CTAB")) (cons 8 (getvar "CLAYER")) (cons 100 "AcDbText") (cons 10 (polar (trans pt_ins 1 0) (+ ang_ins (/ pi 2)) (* 0.15 scal_ins))) (cons 40 (* scal_ins (getvar "TEXTSIZE"))) (cons 1 (itoa value_tag)) (cons 50 ang_ins) (cons 41 1.0) (cons 51 0.0) (cons 7 "$BLK_BORNIER") (cons 71 0) (cons 72 1) (cons 11 (polar (trans pt_ins 1 0) (+ ang_ins (/ pi 2)) (* 0.15 scal_ins))) (cons 210 (trans '(0 0 1) 1 0 T)) (cons 100 "AcDbAttribute") (cons 2 "X0") (cons 70 0) (cons 73 0) (cons 74 1) ) ) (entmake (list (cons 0 "ATTRIB") (cons 100 "AcDbEntity") (cons 67 (getvar "TILEMODE")) (cons 410 (getvar "CTAB")) (cons 8 (getvar "CLAYER")) (cons 100 "AcDbText") (cons 10 (polar (trans pt_ins 1 0) (- ang_ins (/ pi 2)) (* 0.15 scal_ins))) (cons 40 (* scal_ins (getvar "TEXTSIZE"))) (cons 1 "") (cons 50 ang_ins) (cons 41 1.0) (cons 51 0.0) (cons 7 "$BLK_BORNIER") (cons 71 0) (cons 72 1) (cons 11 (polar (trans pt_ins 1 0) (- ang_ins (/ pi 2)) (* 0.15 scal_ins))) (cons 210 (trans '(0 0 1) 1 0 T)) (cons 100 "AcDbAttribute") (cons 2 "X1") (cons 70 0) (cons 73 0) (cons 74 3) ) ) (entmake (list (cons 0 "SEQEND") (cons 8 (getvar "CLAYER")) (cons 62 0) (cons 6 "ByBlock") (cons 370 -2) ) ) (foreach a (vlax-invoke (vlax-ename->vla-object (entlast)) 'GetAttributes) (cond ((= (vla-get-TagString a) "X0") (setq val_tagX (vla-get-TextString a) id_att (vla-get-ObjectID a) ) ) ((= (vla-get-TagString a) "X1") (vla-put-TextString a (strcat "%<\\AcExpr (1+" "%<\\AcObjProp Object(%<\\_ObjId " (itoa id_att) ">%).TextString>%" ")>%" ) ) ) ) ) (prin1) ) -
Polyligne avec largeur personnalisable et texte centré
bonuscad a répondu à un(e) sujet de Red dans LISP et Visual LISP
Bonjour, Alors j'ai essayé d'être plus proche de ta demande avec tes indications fournies. Tu aurais pu être plus précis sur les diamètres, les calques, les styles de texte que tu veux employer. Donc voici un exemple que j'espère tu sauras adapter à tes besoins plus précis... (defun c:conduite ( / AcDoc Space msg_f msg_n n old_cutmnu old_plw old_osm pt_f lst_pt lst_tmp pt_n nw_pl key htx nw_style nw_obj pt rtx dxf_ent tmp deriv) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (eq (getvar "CVPORT") 1) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) msg_f "\nSpécifiez l'extrémité de la ligne ou [annUler]: " msg_n "\nSpécifiez l'extrémité de la ligne ou [Clore/annUler]: " n 0 old_cutmnu (getvar "SHORTCUTMENU") old_plw (getvar "PLINEWID") old_osm (getvar "OSMODE") ) (setvar "OSMODE" 5) (while (null (setq pt_f (getpoint "\nSpécifiez le point de départ de la polyligne: "))) (princ "\nPoint incorrect.") ) (setq pt_f (trans pt_f 1 0) lst_pt (list pt_f) lst_tmp lst_pt) (setvar "LASTPOINT" (car lst_pt)) (initget "U ANNUler _Undo UNDO") (while (and (setq pt_n (getpoint (trans pt_f 0 1) (if (< n 2) msg_f msg_n))) (/= pt_n "Close")) (if (listp pt_n) (progn (setq pt_n (trans pt_n 1 0) lst_pt (cons pt_n lst_pt) lst_tmp lst_pt) (setvar "LASTPOINT" (car lst_pt)) (setq n (1+ n) pt_f pt_n) ) (if (zerop n) (princ "\nTous les segments sont déjà annulés.") (progn (setq lst_pt (cdr lst_pt) lst_tmp lst_pt) (setvar "LASTPOINT" (car lst_pt)) (setq n (1- n) pt_f (getvar "lastpoint")) ) ) ) (if (< n 1) (initget "U ANNUler _Undo UNDO") (initget "U ANNUler Clore _Undo UNDO Close") ) (redraw) (while (cdr lst_tmp) (grdraw (trans (car lst_tmp) 0 1) (trans (cadr lst_tmp) 0 1) 7) (setq lst_tmp (cdr lst_tmp))) ) (redraw) (setq nw_pl (vlax-invoke Space 'AddLightWeightPolyline (apply 'append (mapcar 'list (mapcar 'car lst_pt) (mapcar 'cadr lst_pt))))) (if (eq pt_n "Close") (vlax-put nw_pl 'Closed 1) ) (setvar "SHORTCUTMENU" 11) (setvar "PLINEWID" 0.0) (if (not (eq (substr (getvar "USERS1") 1 3) "plw")) (setvar "USERS1" "plw0") ) (initget "0 2.5 5 7.5 10") (setq key (getkword (strcat "\nDiamètre souhaité [0/2.5/5/7.5/10] <" (substr (getvar "USERS1") 4 3) ">?: "))) (cond ((eq key "0") (setvar "USERS1" "plw0")) ((eq key "2.5") (setvar "USERS1" "plw2.5")) ((eq key "5") (setvar "USERS1" "plw5")) ((eq key "7.5") (setvar "USERS1" "plw7.5")) ((eq key "10") (setvar "USERS1" "plw10")) ) (vlax-put nw_pl 'ConstantWidth (atof (substr (getvar "USERS1") 4 3))) (initget "PVC BETON PEHD") (setq key (getkword "\nType de conduite [PVC/BETON/PEHD]?: ")) (cond ((null (tblsearch "LAYER" (strcat "Conduite-" key))) (vla-add (vla-get-layers AcDoc) (strcat "Conduite-" key)) ) ) (vlax-put nw_pl 'Layer (strcat "Conduite-" key)) (cond ((null (tblsearch "STYLE" "CONDUITE")) (setq nw_style (vla-add (vla-get-textstyles AcDoc) "CONDUITE")) (mapcar '(lambda (pr val) (vlax-put nw_style pr val) ) (list 'FontFile 'Height 'ObliqueAngle 'Width 'TextGenerationFlag) (list (strcat (getenv "windir") "\\fonts\\arial.ttf") 0.0 0.0 1.0 0.0) ) ) ) (initget 6) (setq htx (getdist (getvar "VIEWCTR") (strcat "\nSpécifiez la hauteur du texte <" (rtos (getvar "TEXTSIZE")) ">: "))) (if htx (setvar "TEXTSIZE" htx)) (setq nw_obj (vla-addMtext Space (vlax-3d-point (setq pt (polar '(0.0 0.0 0.0) (* pi 0.5) (getvar "TEXTSIZE")))) (setq rtx 0.0) (strcat "Conduite-" key " %%C:" "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID nw_pl)) ">%).ConstantWidth \\f \"%lu2%pr1\">%" " L = " "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID nw_pl)) ">%).Length \\f \"%lu2%pr1\">%" "m" ) ) ) (mapcar '(lambda (pr val) (vlax-put nw_obj pr val) ) (list 'AttachmentPoint 'Height 'DrawingDirection 'InsertionPoint 'StyleName 'Layer 'Rotation) (list 5 (getvar "TEXTSIZE") 5 pt "CONDUITE" (strcat "Conduite-" key) rtx) ) (setq dxf_ent (entget (entlast))) (while (or (= 5 (car (setq tmp (grread t 5 1)))) (/= (car tmp) 25) (= (car tmp) 3)) (cond ((= 5 (car tmp)) (setq pt (vlax-curve-getClosestPointTo nw_pl (trans (cadr tmp) 1 0)) deriv (vlax-curve-getFirstDeriv nw_pl (vlax-curve-GetParamAtPoint nw_pl pt)) rtx (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR"))) ) (if (or (> rtx (* pi 0.5)) (< rtx (- (* pi 0.5)))) (setq rtx (+ rtx pi))) (entmod (subst (cons 50 rtx) (assoc 50 dxf_ent) (subst (cons 10 (polar pt (+ rtx (* pi 0.5)) (getvar "TEXTSIZE"))) (assoc 10 dxf_ent) dxf_ent) ) ) (entupd (cdar dxf_ent)) ) ((= 3 (car tmp)) (setq nw_obj (vla-addMtext Space (vlax-3d-point (setq pt (polar '(0.0 0.0 0.0) (* pi 0.5) (getvar "TEXTSIZE")))) (setq rtx 0.0) (strcat "Conduite-" key " %%C:" "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID nw_pl)) ">%).ConstantWidth \\f \"%lu2%pr1\">%" " L = " "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID nw_pl)) ">%).Length \\f \"%lu2%pr1\">%" "m" ) ) ) (mapcar '(lambda (pr val) (vlax-put nw_obj pr val) ) (list 'AttachmentPoint 'Height 'DrawingDirection 'InsertionPoint 'StyleName 'Layer 'Rotation) (list 5 (getvar "TEXTSIZE") 5 pt "CONDUITE" (strcat "Conduite-" key) rtx) ) (setq dxf_ent (entget (entlast))) ) (T (princ "\nArrêt anormal de la commande ")) ) ) (entdel (entlast)) (setvar "PLINEWID" old_plw) (setvar "SHORTCUTMENU" old_cutmnu) (setvar "OSMODE" old_osm) (princ) ) -
[Résolu] Xref qui s'insère avec une echelle de 0
bonuscad a répondu à un(e) sujet de zza427 dans AutoCAD 2015
Une échelle de 0 est refusée par AutoCad, donc ce n'est pas possible, cela peut être par contre une échelle de 0.00001 ou pire... mais ta précision d'affichage est insuffisante pour voir ce détail. Utilise la commande UNITES (_UNITS) pour régler ta précision d'affichage. Regarde la variable INSUNITS pour les unités d'insertion. -
Polyligne avec largeur personnalisable et texte centré
bonuscad a répondu à un(e) sujet de Red dans Débuter en LISP
Bonjour, Tu as posté dans le forum "Débuter en lisp"! Donc je ne sais pas jusqu'à quel point tu veux faire une fonction poussée. Dans le passé j'avais fais une fonction pour du câblage électrique que j'avais publié sur CadXP (je suis pas du tout dans cette branche). En faisant une recherche sur le site avec comme mot-clé: c:cablage ou c:id_cabalage ou encore c:Tab_cable tu devrais retrouvé les sujets qui en parlent... Je pense que tu pourrais partir dans cette optique (c'est un peu avancé, mais tu verra que les possibilités peuvent être énormes) Je te donnes les lisps en lien afin que tu puisses tester et te faire une idée. cablage.lsp id_cablage.lsp Tab_Cable.lsp Voilà si ça t’intéresse, je pense que tu pourrais l'adapter aux conduites de réseaux... -
C'est déjà bien d'essayer de s'y mettre ;) Dans la foulée je te présente du brut en vlax-curve (sans contrôle d'erreur) Celui devrait fonctionner pour toutes les objets curvilignes: ligne, arc, polyligne, spline, ellipse et cercle (mais ces 2 dernier n'ont pas trop d’intérêt). Quand tu auras le temps de t'y remettre... ((lambda ( / vlaobj) (setq vlaobj (vlax-ename->vla-object (car (entsel)))) (trans (vlax-curve-getPointAtParam vlaobj (+ (vlax-curve-getStartParam vlaobj) (* 0.5 (- (vlax-curve-getEndParam vlaobj) (vlax-curve-getStartParam vlaobj)) ) ) ) 0 1 ) ))
-
Bonjour, Puisque tu exploite les données DXF, je vais te donner une piste avec ceux-ci. Avec les fonctions vlax-curve cela aurait été encore plus simple... (milieu de l'objet curviligne) ((lambda ( / ent dxf_ent dxf_10 dxf_40 dxf_50 dxf_51) (cond ((setq ent (entsel)) (setq dxf_ent (entget (car ent)) dxf_10 (cdr (assoc 10 dxf_ent)); le centre dxf_40 (cdr (assoc 40 dxf_ent)); le rayon dxf_50 (cdr (assoc 50 dxf_ent)); l'angle de départ (sens trigo) dxf_51 (cdr (assoc 51 dxf_ent)); l'angle d'arrivée (idem) ) (trans (polar dxf_10 (+ dxf_50 (* 0.5 (- (if (< dxf_51 dxf_50); test du passage du dernier quadrant à un quadrant inférieur (+ (* 2 pi) dxf_51) dxf_51 ) dxf_50 ) ) ) dxf_40 ) 0 1 ) ) ) ))
-
Valeur initial d'un attribut qui modifie d'autre attirbuts
bonuscad a répondu à un(e) sujet de Flobott dans AutoCAD 2016
Bonjour, Ton histoire m'a intrigué et j'ai essayé de reproduire ce que tu relate. Effectivement le fait d'attribuer une action dynamique ET de l'activer au moins une fois après l'insertion rend les champs fonctionnel. (assez étrange ce comportement!) Sans faire d'action dynamique, il y a peut être une solution..., va t-elle te convenir? En fait il ne faut pas définir le champ dynamique pour l'étiquette X1 lors de la définition du bloc. C'est après l'insertion du bloc que tu défini le champ en double-cliquant sur l'attribut X1 pour ouvrir l'éditeur d'attribut, et là tu défini ton champ dynamique (click-droit dans le champ valeur et "insérer un champ") dans formule mettre 1+ (et refaire click-droit pour insérer encore un champ) Choisir objet et sélectionner ton insertion de bloc et prendre X0 dans la liste proposée. Retour à la formule (on peut faire évaluer pour voir le résultat) et OK. Ce que je suggére alors et de ne plus utiliser inserer (car tu serais obligé de refaire la manip ci-dessus à chaque fois, fastidieux!...), mais de copier ton bloc (avec copier ou l'utilisation des grips) Une fois les copies faites tu double-clique sur l'attribut X0 pour mettre la valeurs qui t'intéresse, X1 suivra lors de la mise à jour du champ ou un regen. Cette méthode peut bien faire l'affaire et être aussi rapide qu'une insertion si les échelles/orientations sont toujours les mêmes. -
Audit de conformité des logiciels Autodesk
bonuscad a répondu à un(e) sujet de La Lozère dans AutoCAD 2015
Toutes les info de licence des version installées ET désinstallées sont stockées dans le MBR du disque (que se soit des licences à 30 jours ou non). Donc à moins de faire un RAZ du MBR, impossible de nettoyer ces infos. Il y a un outil de Microsoft qui le permet, autrement un re-partitionnement du disque fait aussi la même chose (cette 2 ème solution nécessite de tout réinstaller, Windows y compris). Dans les deux cas, tu sera obligé de réactiver la licence que tu veux conserver, car elle seront toute perdues. -
LISP TRAITEMENT AFFICHAGE CONTENU MLEADER
bonuscad a répondu à un(e) sujet de jcouaknine dans Routines LISP
Bonjour, Change simplement la ligne (entmod (subst '(291 . 0) (assoc 291 (entget ent)) (entget ent))) par, (entmod (subst '(141 . 5.0) (assoc 141 (entget ent)) (entget ent))) Sachant que 5.0 est la valeur maxi pour la taille du masque (c'est une valeur d'échelle), à toi de mettre une valeur qui te convienne. Cette substitution devrait répondre à tes remarques. -
LISP TRAITEMENT AFFICHAGE CONTENU MLEADER
bonuscad a répondu à un(e) sujet de jcouaknine dans Routines LISP
Bonjour, Est ce bien le résultat de cette routine que tu désire? (vl-load-com) (defun c:test ( / js n ent mLeader) (princ "\nSélectionner les lignes de repère multiples.") (or (setq js (ssget "_I" '((0 . "MULTILEADER")))) (setq js (ssget "_P" '((0 . "MULTILEADER")))) ) (cond (js (sssetfirst nil js) (initget "Existant Nouveau _Existent New") (if (eq (getkword "\nTraiter jeu de sélection [Existant/Nouveau] <Existant>: ") "New") (progn (sssetfirst nil nil) (setq js (ssadd) js (ssget '((0 . "MULTILEADER"))))) ) ) (T (setq js (ssget '((0 . "MULTILEADER")))) ) ) (cond (js (repeat (setq n (sslength js)) (setq mLeader (vlax-ename->vla-object (setq ent (ssname js (setq n (1- n)))))) (vlax-put mLeader 'TextString (strcat "{\\C7;" (vlax-get mLeader 'TextString) "}")) (vlax-put mLeader 'TextBackgroundFill -1) (entmod (subst '(291 . 0) (assoc 291 (entget ent)) (entget ent))) ) ) ) (prin1) ) -
[Résolu] Nombre de caractères limité dans un mleader...
bonuscad a répondu à un(e) sujet de denisf dans LISP et Visual LISP
Bonjour, Pour un MLEADER tu retombe dans la même configuration d'un MTEXT Au delà de 250 caractères la chaine est stockée dans un ou plusieurs groupes de code DXF 3 par tranche de 250 caractères. Les dernier restant (ou si inférieur à 250) sont stocké dans le code groupe 1 (comme pour un TEXT classique). Pour moi la solution de facilité est d'utiliser les fonctions vla- qui gèrent très bien cette limitation sans te casser la tête. Un exemple tiré de l'aide en reprenant ton désidérata. (defun c:Example_AddMLeader() (setq acadObj (vlax-get-acad-object)) (setq doc (vla-get-ActiveDocument acadObj)) ;; Define the leader points (setq points (vlax-make-safearray vlax-vbDouble '(0 . 5))) (vlax-safearray-fill points (append (getpoint "\n1er point :") (getpoint "\n2ème point: "))) (setq i 0) ;; Add the mleader object to model space (setq modelSpace (vla-get-ModelSpace doc)) (setq mLeader (vla-AddMLeader modelSpace points i)) (mapcar '(lambda (pr val) (vlax-put mLeader pr val) ) (list 'TextString 'StyleName 'Layer) (list (strcat "xxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" "\nxxxxxxxxxxxxxxxxxxxx" ) "Standard" "0" ) ) ) -
[Résolu] Talus de CadXP qui me pose problème
bonuscad a répondu à un(e) sujet de DenisHen dans Routines LISP
Salut, Intention louable, mais j'ai bien peur que ce fusse une fausse bonne idée. Renommer n'est pas si simple que ça (bien que ce soit faisable), il faut que tout suive dans les appel du lisp, dans les index du dcl et dans l'appel de clichés dans le SLB (il n'y a pas de fichier SLD comme tu le mentionne). Donc j'ai un gros doute sur les modifications apportées... J'ai téléchargé ton zip de départ pour voir, je n'ai constaté aucun renommage! Par contre l'encodage du fichier à l'air d'avoir changé (les caractères accentués ne sont plus lisible), pour information: J'affectionne l'encodage en UTF-8 qui ne pose pas de problème d'échange sur le net. OUI. Ce dernier ce comporte comme l'ancien lisp avec la détection de la 3D en plus. Il n'a pas de boite de dialogue mais a l'avantage d'être beaucoup plus rapide à l'exécution graphique (mise en place des barbules) -
[Résolu] Talus de CadXP qui me pose problème
bonuscad a répondu à un(e) sujet de DenisHen dans Routines LISP
Pour ma part aucun problème sous une 2014, avec la version 3D ou l'ancienne. As tu essayer talus3D? Rappel: Didier Duhem a publié une routine pour les talus et bien sûr sa version et la mienne se marchent sur les pieds car elles se prénomme pareil (On ne l'a pas fait exprès). Je parle de l'ancienne version utilisant la boite de dialogue. Donc attention si tu possède les 2 versions, car ça peut créer des conflits. PS: Autrement bien vérifier que les fichier talus.dcl et talus.slb soient accessibles à travers les chemins déclarés dans Autocad. -
[Résolu] Talus de CadXP qui me pose problème
bonuscad a répondu à un(e) sujet de DenisHen dans Routines LISP
Bonjour, Ma page perso ayant été sucrée par SFR! (je ne suis plus client, et je l'ai pas refaite...), je te donne des liens directs Talus3D.lsp Conseillée, fonctionne en 2D aussi. Ou beaucoup plus ancien, en 2D uniquement talus.lsp -> le lisp talus.dcl -> La boite de dialogue talus.slb -> le fichier de clichés pour la boite de dialogue. -
Exécution d'un LISP lors d'un REGEN / Impression
bonuscad a répondu à un(e) sujet de Bapt dans AutoCAD 2017
Bonjour, Et créer/remettre tout à jour avec une seule commande, ça pourrait faire l'affaire? Exemple: (defun c:CTR ( / el js js_text nb n ent dxf_ent pt_v l h ins_pt pt_cen) (vl-load-com) (foreach el (layoutlist) (setvar "CTAB" el) (setq js (ssget "_X" (list '(0 . "VIEWPORT") '(67 . 1) (cons 410 el) '(-4 . "!=") '(69 . 1) ) ) ) (if (setq js_text (ssget "_X" (list '(0 . "MTEXT") '(8 . "Bapt") '(67 . 1) (cons 410 el)))) (repeat (setq nb (sslength js_text)) (entdel (ssname js_text (setq nb (1- nb)))) ) ) (repeat (setq n (sslength js)) (setq js_obj nil pt_v (cdr (assoc 10 (setq dxf_ent (entget (setq ent (ssname js (setq n (1- n)))))))) l (cdr (assoc 40 dxf_ent)) h (cdr (assoc 41 dxf_ent)) ins_pt (list (- (car pt_v) (* 0.5 l)) (- (cadr pt_v) (* 0.5 h)) 0.0) pt_cen (cdr (assoc 12 dxf_ent)) ) (entmake (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(67 . 1) (cons 410 el) '(8 . "Bapt") '(100 . "AcDbMText") (cons 10 ins_pt) '(40 . 3.5) '(41 . 0.0) '(46 . 0.0) '(71 . 7) '(72 . 5) (cons 1 (strcat "{\\fArial|b0|i0|c0|p34;" el " : " (rtos (car pt_cen) 2 2) " ; " (rtos (cadr pt_cen) 2 2))) '(7 . "Standard") '(210 0.0 0.0 1.0) '(11 1.0 0.0 0.0) '(50 . 0.0) '(73 . 1) '(44 . 1.0) ) ) ) ) (prin1) ) -
Un petit éclaircissement... La première solution force l'écriture en grade quelque soit l'unité angulaire employé dans le dessin. La deuxième solution écrit la valeur angulaire selon l'unité angulaire en cours dans le dessin (si grade alors écriture en grade, si degré alors écriture en degré)
-
Deux possibilités, forcer l'écriture en grade ou prendre les unités angulaire en cours dans le dessin. Pour cela il te faut changer la ligne 21 du code pour, respectivement: Solution 1 "A = " (angtos (- pi (* 2 alpha)) 2 4) Solution 2 "A = " (angtos (- pi (* 2 alpha)) (getvar "AUNITS") 4)
-
Bonjour, Effectivement, le filtre présenté dans le code semble incomplet! Soit tu fais la modification proposée par Olivier, soit tu récupère l'original que je remet à ta disposition sur le lien ci-dessous: ARTDB.lsp
-
Bonjour, J'ai essayé d'améliorer la fonction. Celle ci est capable de traiter des lignes, arcs, polylignes optimisées, polylignes 2D et polylignes 3D. Elle doit fonctionner dans ET depuis n'importe quel SCU. (un bémol avec des polylignes splinées ou la fonction peut avorté, un changement de zoom peut régler le problème...) Les objets à traiter peuvent être filtrer auparavant avec FILTRER ou SELECTRAP par exemple, la fonction proposera alors de travailler avec ce jeu de sélection ou d'en créer un nouveau. (vl-load-com) (defun c:div_pl ( / js res AcDoc Space n ent obj_vlax nam_obj perim_obj res_track l_pt lg) (or (setq js (ssget "_I" '((-4 . "<AND") (0 . "*POLYLINE,LINE,ARC") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>") (-4 . "AND>")))) (setq js (ssget "_P" '((-4 . "<AND") (0 . "*POLYLINE,LINE,ARC") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>") (-4 . "AND>")))) ) (cond (js (sssetfirst nil js) (initget "Existant Nouveau _Existent New") (if (eq (getkword "\nTraiter jeu de sélection [Existant/Nouveau] <Existant>: ") "New") (progn (sssetfirst nil nil) (setq js (ssadd) js (ssget '((-4 . "<AND") (0 . "*POLYLINE,LINE,ARC") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>") (-4 . "AND>")))) ) ) ) (T (setq js (ssget '((-4 . "<AND") (0 . "*POLYLINE,LINE,ARC") (-4 . "<NOT") (-4 . "&") (70 . 112) (-4 . "NOT>") (-4 . "AND>")))) (sssetfirst nil js) ) ) (cond (js (initget 7) (setq res (getint "\nNombre de division: ") AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (setvar "cmdecho" 0) (repeat (setq n (sslength js)) (setq ent (ssname js (setq n (1- n)))) (cond ((entget ent) (setq obj_vlax (vlax-ename->vla-object ent) nam_obj (vlax-get-property obj_vlax "ObjectName") ) ) (T (setq ent nil)) ) (cond (ent (setq perim_obj (if (vlax-property-available-p obj_vlax "Length") (vlax-get-property obj_vlax "Length") (vlax-get-property obj_vlax "ArcLength") ) res_track (/ perim_obj res) l_pt '() lg 0.0 ) (while (and (< (+ lg res_track) perim_obj) (not (equal (+ lg res_track) perim_obj 1E-11))) (setq l_pt (cons (trans (vlax-curve-getPointAtDist obj_vlax (setq lg (+ lg res_track))) 0 1) l_pt)) ) (foreach n l_pt (if (member nam_obj '("AcDb2dPolyline" "AcDb3dPolyline")) (progn (vl-cmdf "_.zoom" "_object" (car (nentselp n)) "") (vl-cmdf "_.break" (nentselp n) "_first" "_none" n "_none" n) (vl-cmdf "_.zoom" "_previous") ) (vl-cmdf "_.break" (cons ent (list n)) "_first" "_none" n "_none" n) ) ) ) ) ) (setvar "cmdecho" 1) ) ) (prin1) )
