Aller au contenu

Polyligne avec largeur personnalisable et texte centré


Messages recommandés

Posté(e)

Bonjour, dans le cadre de mon entreprise je suis amené à créer un bouton autolisp pour faciliter la création de conduite d'EP EU etc

 

Mon but serai de créer une polyligne avec un accrochage par défaut Extrémité et Centre, la tracer manuellement avec "getpoint", à cela je pensai mettre un "entlast" pour la sélectionner et avec "_pedit" lui donner manuellement sa largeur globale avec un "getdist" ? sachant que selon la canalisation elle serait amenée à changer d'une polyligne à l'autre.

 

A cela dans l'idéal il faudrait que j'arrive à créer un texte situé au centre de la polyligne décalée vers le haut ou il y aurait les données suivantes (issues des caractéristiques de la polyligne ? utiliser une liste avec les car cdr ?), choix entre 3 canalisation PVC/BETON/PEHD, me donner son diamètre (en rapport avec sa largeur donnée et en utilisant le logo diamètre avec %%C) ainsi que sa longueur en Mètre et possiblement la possibilité de choisir de l'écrire manuellement en tant que texte libre. Et possibilité de l'avoir "interactif" c'est à dire que si je change manuellement la largeur de polyligne, que cela se reporte sur le texte.

 

 

Voila je sais que la commande est peut être ultra poussée mais dans l'idée j'aimerai faire quelque chose de propre et bien construit, le problème est que je n'ai qu'effleuré le LISP et j'essaye de m'instruire comme je peut avec votre forum, joch04.free.fr et des articles que giles à écrit mais voila je m'y perd un peut et je n'arrive pas à trouver quelques exemples pour bien comprendre.

 

Bonuscad m'avais dirigé vers un de ses lisp "cablage" mais le problème étant que je ne comprend pas grand chose il y à des "(vlax-ldata-put" chose que j en'ai pas pu voir en cour ...

 

Donc si vous avez juste des lisp d'édition de polyligne et un ou il y aurait une fonction pour éditer un texte je suis preneur pour le décortiquer et comprendre comment cela marche ...

 

(Je suis aussi preneur de tout site me permettant d'apprendre plus sur du lisp car de ce que je comprend il y à milles façons pour arriver à un résultat)

 

Merci d'avance pour ce qui auront le temps et la patience de lire ce post et de s'y pencher.

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)

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

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Merci, je vais m'y pencher après mon travail.

 

Je suis désolé je suis un peu un boulet mais voila je suis en formation de CAO DAO et à l'occasion je vous scannerai mes feuilles de "cour" qui vous montrerons le niveau donné en comparaison du projet à accomplir ...

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)

Alors tout d'abord je n'ai qu'un mot à dire ... OUAAAAAAAH !!

 

Certes il y à quelques fonctions et options à changer pour coller au plus proche de ce que j'imagine, mais ouah dans l'idéal c'est ce que je vise :(rires forts):

 

Maintenant un soucis se pose ... je n'arrive pas du tout à comprendre ton lisp ... alors certes, il frôle la perfection mais inatteignable pour mon niveau, alors que j'aimerai le comprendre, analyser le pourquoi du comment ...

 

Pour faire simple je suis en licence pro CAO DAO et j'ai eu que 4 jours de formation sur lisp ou l'on à créé des mini programme avec (command "blabla" ) etc enfin ce que je considère comme système D ..

 

Après je peut te détailler vraiment comment je le voyais mais attention je ne demande pas à ce qu'il me soi servi sur un plateau, mon but étant de me faire aider mais de comprendre le fond du lisp afin d'en ressortir plus instruit.

 

Je vais écrire comment je voyais la logique de la chose au plus simple pour ne pas m'embrouiller:

 

-lancer la commande

 

-donner setvar "osmode" a 6 pour un accrochage milieu (2) + centre (4)

 

-créer la polyligne en la traçant puis entrer pour valider

 

-créer la même fenêtre de sélection que toi avec un "iniget" et "getkword" (fonction que j'essaye de modifier pour la comprendre)

 

-pour donner différents choix comme l'épaisseur et les choix (PVC/BETON/PEHD)

 

-la mettre dans un calque prédéfini

 

-Pour le texte arriver à combiner un certain décalage par défaut admettons de 1 au dessus du milieu de la polyligne qui s'adapterai ex: polyligne=0 décalage du texte=1 et si polyligne=2 décalage texte=1+2

 

-Dans ce texte, les informations seraient si on clique sur le futur bouton réseau EP, le texte aurait comme résultat EP-BETON %%c200 L=xx,xm tout en plaçant le texte dans un autre calque prédéfini.

 

à savoir que les conduites en 200 sont tracés en polyligne 0.2

 

Voila comment je voyais la commande.

 

Donc voila une fois de plus je te remercie grandement pour ce que tu à fais et je ne demande ou n'exige pas avoir un lisp correspondant exactement à ce que j'imagine.

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)

Et voici un exemple de ce que je tente de faire en me dépatouillant pour un autre projet, c'est histoire de montrer comment de lisp (sans se moquer hein) je suis encore un novice en la matière, il y à des règles élémentaires que je ne maîtrise pas <_<

 

A savoir que la aussi j'ai un soucis ou je n'arrive pas à bien placer ma commande pour donner la première polyligne dans un calque et la polyligne décalée dans un autre mais sa ... c'est un autre problème <_<

 

 

(defun c:borax (/ ent REP EP DC)
 (setvar "OSMODE" 6)
 (initget "A1 A2")
 (setq REP (getkword "\nType de bordure [A1/A2] <A1> : "))
 (if (not rep)
   (setq rep "A1")
 )
 (cond

   ((= REP "A1")
    (Prompt
      "\nCliquer le parcour de votre réseau <Taper (Return) pour FIN>"
    )
    (terpri)
    (setq pt (getpoint "\nPoint de Départ: "))
    (command "polylign" pt "la" 0.02 0.02)
    (while pt
      (setq pt (getpoint "\nPoint suivant ou fin (Return pour FIN): "))
      (command pt)
    )
[b](command "_chprop" (entlast) "" "_la" SRMV_Bordure_A1_AVANT "")[/b]
    (setq EP 0.02)
    (setq DC 0.2)
[b](command "_chprop" (entlast) "" "_la" SRMV_Bordure_A1_ARRIERE "")[/b]
   )

   ((= REP "A2")
    (Prompt
      "\nCliquer le parcour de votre réseau <Taper (Return) pour FIN>"
    )
    (terpri)
    (setq pt (getpoint "\nPoint d'origine: "))
    (command "polylign" pt "la" 0.02 0.02)
    (while pt
      (setq pt (getpoint "\nPoint suivant(Return pour FIN): "))
      (command pt)
    )
    (setq EP 0.02)
    (setq DC 0.15)
   )
 )
 (if (setq ent (car (entsel)))
   (progn
     (command "_.offset" DC ent pause "")
     (command "_.pedit" (entlast) "la" EP "")
   )					; fin progn
 )					; fin if
 (princ)
)

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)

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.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

G.E.N.I.A.L. merci pour l'astuce du code :D

 

Je suis en train de scrutter tes modifs, de ce que je comprend tu met

(if (not (tblsearch "LAYER" "SRMV_Bordure_A1_AVANT"))
               (command "_.layer" "_new" "SRMV_Bordure_A1_AVANT" "")

pour dire si il n'y à pas dans > tblsearch > layer > le calque nommé srmv... Alors lance moi la commande layer nouveau il s'appelle srmv .... Simple mais efficace, je ne savais pas que l'on pouvais faire comme ça.

 

Par contre le

(while (not (zerop (getvar "CMDACTIVE")))
               (command pause)

est un mystère pour moi

 

Dans le fichier introduction à autolisp de (giles), que j'ai imprimé et relié, stabiloté, griffonné, il y à écrit (p14) que c'est utilisé pour laisser la main à l'utilisateur tant que la commande est active c'est à dire ? C'est ce qui m’empêchai la commande de placement dans un calque de fonctionner ?

 

ta façon de tracer des polyligne aussi, quel est la différence avec ma commande ?

 

(command "_.pline" pause "_width" 0.02 0.02)

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)

En le modifiant quelque peu j'arrive à ce que je voulais pour cette commande ci

 

(defun c:boraxt ( / 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" "")
       )
       (if (not (tblsearch "LAYER" "SRMV_Bordure_A2_AVANT"))
               (command "_.layer" "_new" "SRMV_Bordure_A2_AVANT" "")
       )
       (if (not (tblsearch "LAYER" "SRMV_Bordure_A2_ARRIERE"))
               (command "_.layer" "_new" "SRMV_Bordure_A2_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)
       )
       (cond
               ((= REP "A1")(command "_.chprop" (entlast) "" "_layer" "SRMV_Bordure_A1_AVANT" "")
                       (setq DC 0.2)
       (command "_.offset" DC (entlast) pause "")
       (command "_.chprop" (entlast) "" "_layer" "SRMV_Bordure_A1_ARRIERE" "")
       (prin1)

	 )
               ((= REP "A2")(command "_.chprop" (entlast) "" "_layer" "SRMV_Bordure_A2_AVANT" "")
                       (setq DC 0.15)
       (command "_.offset" DC (entlast) pause "")
       (command "_.chprop" (entlast) "" "_layer" "SRMV_Bordure_A2_ARRIERE" "")
       (prin1)

	 )
       )

)

 

J'ai ajouté la vérification et la création du calque pour la bordure A2 si elle n'existe pas puis en déplaçant (command "_.chprop" (entlast) "" "_layer" "SRMV_Bordure_A2_AVANT" "") après le choix de sélection du type de bordure, j'arrive à dire à ma polyligne principale de se caler dans le calque AVANT et celle décalée dans le calque ARRIERE

 

Pour aller plus loin admettons que je veuille y rajouter une couleur en créant ce calque, ou est ce que je peut trouver la démarche

 

        (if (not (tblsearch "LAYER" "SRMV_Bordure_A1_AVANT"))
               (command "_.layer" "_new" "SRMV_Bordure_A1_AVANT" "")

 

Je me doute qu'il doit y avoir une commande dans _.layer color etc mais comment trouver quel chemin faire ? Ne me donne pas le code directement j'aimerai essayer de trouver seul :D , mais je ne suis pas contre une explication de pourquoi tu écrit "_.layer" moi en temps normal je fais la commande, lis en bas dans la ligne de commande et je progresse pas à pas en gros j'aurai fais

 

(command "-calque" "n" "SRMV_bordure" "" "")
  (command "-calque" "ch" "SRMV_bordure" "")
    (command "-calque" "co" "u" "0,165,41" "" "" "")

 

Car quand j'écris "_.LAYER" c'est une fenêtre qui s'ouvre du coup je ne sais pas quelle commande écrire pour changer la couleur d'un calque particulier :blink:

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)
C'est ce qui m’empêchai la commande de placement dans un calque de fonctionner ?

 

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

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)
pourquoi tu écrit "_.layer" moi en temps normal je fais la commande, lis en bas dans la ligne de commande et je progresse pas à pas

 

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)

 

Je me doute qu'il doit y avoir une commande dans _.layer color etc mais comment trouver quel chemin faire ?

 

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.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e) (modifié)

D'accord, je t'avouerai que j'ai flané sur le forum pour "assemble" pleins de commande que je voulais et les retravailler pour avoir un résultat qui marche <img src='http://cadxp.com/public/style_emoticons/<#EMO_DIR#>/laugh.gif' class='bbc_emoticon' alt=':(rires forts):' /> et comme mon niveau n'est pas très élevé et bien je ne sais pas qu'est ce qui deviens inutile dans mon lisp ..

 

Ok, pour le calque sans les guillemets j'avais vu sa dans un article du forum, avec sa ne marchait pas et quand je les enlevai cela marchai du coup je les ai virés :D

 

Par contre je remarque que ma largeur de polyligne par défaut reste à 0.02 soit l'épaisseur donnée dans la commande, du coup il me faudrait placer un (setvar "PLINEWID" "0" "") quelque part, est ce qu'à la fin de ma commande cela marcherai, comment je peut savoir à quel endroit le placer ?

 

((= REP "A2")(command "_.chprop" (entlast) "" "_layer" "SRMV_Bordure_A2_AVANT" "")
                       (setq DC 0.15)
       (command "_.offset" DC (entlast) pause "")
       (command "_.chprop" (entlast) "" "_layer" "SRMV_Bordure_A2_ARRIERE" "")
       (prin1)

                )
       )
(setvar "PLINEWID" "0" "")
)

 

Après je sais que ma façon de coder est très rudimentaire je passe beaucoup par (command "xx") car je ne sais pas ou chercher exemple ou toi tu utilise "_.LAYER" et moi "-calque" car dans "_.LAYER" je ne trouve aucune indications ...

 

D'accord cela explique pourquoi avec "-calque" je voyais quoi taper .. mais du coup comment fais tu pour connaitre un chemin précis avec ton "_.LAYER" ?

Modifié par Red

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)

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)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

D'accord merci beaucoup pour l'explication, maintenant je vais essayer de transcrire ton lisp (deuxième post) dans un langage que je comprend mieux mais je ne promet rien <_< ou alors essayer de trouver les points de modifications pour changer ce qui ne conviens pas. :)

 

Encore une fois merci de ton aide.

“L'environnement est important, pour sauver un arbre, mangez un castor !”

  • 3 semaines après...
Posté(e)

Après avoir imprimé en feuille A3 ton code puis en l'ayant surligné de partout j'ai réussi à trouver quelle partie du code fessait quoi. Je vois aussi quelle parties je veut modifier mais voila quelques problèmes se posent ... cela m'est impossible :huh:

 

J'aimerai donner une largeur de polyligne en rentrant le diamètre de la canalisation puis faire en sorte que cette canalisation se mette en largeur globale de polyligne mais en plus petit (ex diamètre 200 = ep globale de 0.2, 300 = ep globale de 0.3)

 

J'aimerai changer aussi le mot conduite qui est prédéfini ainsi que de pouvoir placer le texte ou bon me semble le long de la polyligne

 

Et lors de la fin du programme le texte s'écrit 2 fois chose que je n'arrive pas à enlever ..

 

Je suis totalement en galère par ce que je ne comprend pas comment exploiter et modifier le code, trop de partie codée que je ne comprend pas ..

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)
J'aimerai donner une largeur de polyligne en rentrant le diamètre de la canalisation puis faire en sorte que cette canalisation se mette en largeur globale de polyligne mais en plus petit (ex diamètre 200 = ep globale de 0.2, 300 = ep globale de 0.3)

 

Par exemple:

Changer dans le code

 (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"))
 )

Par

 (initget "0 100 200 250 500 750")
 (setq key (getkword (strcat "\nDiamètre souhaité [0/100/200/250/500/750] <" (substr (getvar "USERS1") 4 3) ">?: ")))
 (cond
   ((eq key "0") (setvar "USERS1" "plw0"))
   ((eq key "100") (setvar "USERS1" "plw0.1"))
   ((eq key "200") (setvar "USERS1" "plw0.2"))
   ((eq key "250") (setvar "USERS1" "plw0.25"))
   ((eq key "500") (setvar "USERS1" "plw0.5"))
   ((eq key "750") (setvar "USERS1" "plw0.75))
 )

 

J'aimerai changer aussi le mot conduite qui est prédéfini ainsi que de pouvoir placer le texte ou bon me semble le long de la polyligne

 

changer dans le code (2 occurences]

     (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"
     )

par

     (strcat
       key
       "Tuyau-" ; ou tout autres textes ou supprimer la ligne pour aucun texte
       " %%C:"
       "%<\\AcObjProp Object(%<\\_ObjId "
       (itoa (vla-get-ObjectID nw_pl))
       ">%).ConstantWidth \\f \"%lu2%pr0%ct8[1000]\">%" ; facteur de 1000 pour retrouver le diamètre original
       " L = "
       "%<\\AcObjProp Object(%<\\_ObjId "
       (itoa (vla-get-ObjectID nw_pl))
       ">%).Length \\f \"%lu2%pr1\">%"
       "m"
     )

 

Je crois que tu n'as pas saisi la subtilité lors de l'utilisation du code.

Lorsque tu as valider ta hauteur de texte, le texte apparait, sans rien valider BOUGE TON CURSEUR, tu peux positionner l'emplacement avec un clic-gauche de ton texte le long de ta polyligne. Un texte apparait de nouveau que tu peux aussi positionner ou alors un clic-droit pour mettre fin. Tu peux ainsi mettre autant de textes répétitif que tu veux le long de ta polyligne.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Par exemple:

Changer dans le code

 (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"))
 )

Par

 (initget "0 100 200 250 500 750")
 (setq key (getkword (strcat "\nDiamètre souhaité [0/100/200/250/500/750] <" (substr (getvar "USERS1") 4 3) ">?: ")))
 (cond
   ((eq key "0") (setvar "USERS1" "plw0"))
   ((eq key "100") (setvar "USERS1" "plw0.1"))
   ((eq key "200") (setvar "USERS1" "plw0.2"))
   ((eq key "250") (setvar "USERS1" "plw0.25"))
   ((eq key "500") (setvar "USERS1" "plw0.5"))
   ((eq key "750") (setvar "USERS1" "plw0.75))
 )

 

 

 

changer dans le code (2 occurences]

     (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"
     )

par

     (strcat
       key
       "Tuyau-" ; ou tout autres textes ou supprimer la ligne pour aucun texte
       " %%C:"
       "%<\\AcObjProp Object(%<\\_ObjId "
       (itoa (vla-get-ObjectID nw_pl))
       ">%).ConstantWidth \\f \"%lu2%pr0%ct8[1000]\">%" ; facteur de 1000 pour retrouver le diamètre original
       " L = "
       "%<\\AcObjProp Object(%<\\_ObjId "
       (itoa (vla-get-ObjectID nw_pl))
       ">%).Length \\f \"%lu2%pr1\">%"
       "m"
     )

 

Je crois que tu n'as pas saisi la subtilité lors de l'utilisation du code.

Lorsque tu as valider ta hauteur de texte, le texte apparait, sans rien valider BOUGE TON CURSEUR, tu peux positionner l'emplacement avec un clic-gauche de ton texte le long de ta polyligne. Un texte apparait de nouveau que tu peux aussi positionner ou alors un clic-droit pour mettre fin. Tu peux ainsi mettre autant de textes répétitif que tu veux le long de ta polyligne.

 

Tout d'abord merci de ta réponse,

 

Le soucis du diamètre est qu'il faut répertorier tout les diamètre existant pour tout les types de conduites ... et dieu sait qu'il y en à beaucoup :unsure:

 

Et au cour de ma formation je n'ai pas vu les vla-get etc du coup je patauge un peu .. :unsure:

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)
Et au cour de ma formation je n'ai pas vu les vla-get etc du coup je patauge un peu .. :unsure:

 

Je comprends bien, mais n'as tu pas placé la barre un peu haut?

Et possibilité de l'avoir "interactif" c'est à dire que si je change manuellement la largeur de polyligne, que cela se reporte sur le texte.

Et ça je ne sais le faire qu'avec des fonctions vla, donc c'est pour ça que je te les ais proposées.

 

Un truc sympa qui peut t'aider en vla: une fonction dump & dumpn

Ca te permettra de connaitre les propriétés accessible d'un objet...

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Je m’immisce un peu, mais pourquoi ne pas faire ça pour le diamètre au lieu des (cond ?

(setvar "USERS1" (strcat "plw" (rtos (itoa (/ Key 100)) 2 0)))

Désolé si ce n'est pas réellement exact, mais j'improvise... Je pense qu'il y a de l'idée...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

La problematique est que c'est dans l'optique d'un projet de fin d'année mais mon professeur de lisp qui est censé s'y connaitre quand même en 35ans de carriere ????

Et il est au final totalement largué par ce que je lui dit ..

Alors que la avec le lisp que tu m'a fourni et bien je voit que cest pas si loins de ce que j'imaginais alors je me dit que c'est possible quand meme ..

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)

Je vais essayer de vous preciser comment je voyai la chose a mon niveau

 

Creer manuellement la polyligne avec des accrochage predefini avec "osmode"

 

Y affecter une epaisseur globale avec "la" et un "getreal" ou "getdist"

 

Mettre une ligne de code predefinie avec valeur predefinie setq (Ep Eu ou autre)

 

Setq (largeur du diametre a ecrire dans le texte ici on pourra mettre 200 directement)

 

Avec un initget faire un choix multiple entre beton pvc etc

 

Lancer une commande texte qui aurait la meme flexibilité que la tienne et j'y mettrai a la suite les differents "variables" données dans les setq precedents

 

Le predefini, le choisi avec initget, le diametre ou je mettrai le cc% du diametre puis la valeur donnee manuellement et jabandonnerai la longueur

 

En soi je trouve ça facile sur papier mais sur code rien ne marche comme je veut ????

 

(Désolé si je me suis trompé en citant les commande je suis sur mon téléphone sans notes a coté)

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)

Je m’immisce un peu, mais pourquoi ne pas faire ça pour le diamètre au lieu des (cond ?

(setvar "USERS1" (strcat "plw" (rtos (itoa (/ Key 100)) 2 0)))

Désolé si ce n'est pas réellement exact, mais j'improvise... Je pense qu'il y a de l'idée...

 

Salut je viens d'essayer avec ta commande et l'erreur "numberp" apparait ..

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)

Par ce que la, mon objectif est de remplacer le initget par une sélection manuelle

 

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

 

Et en résultat quand j'invite à taper le diamètre ex:200 et bien le plw se mettrai à 0.2 (division par 1000) ou alors jessaie de passer par "la" pour la largeur de polyligne.

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)

Oops, je n'avais pas vu ce initget... Key est donc une chaine et non un nombre... Essaie ça :

(setvar "USERS1" (strcat "plw" key))

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Oops, je n'avais pas vu ce initget... Key est donc une chaine et non un nombre... Essaie ça :

(setvar "USERS1" (strcat "plw" key))

 

En remplaçant l'intégralité du code que j'ai cité par ce que tu me donne j'ai erreur stringp "chiffre tapé" je pense qu'en mettant (strcat "plw" key) le key est dans un format différent et ne s'applique pas comme nombre valeur à "plw"

“L'environnement est important, pour sauver un arbre, mangez un castor !”

Posté(e)

Du coup j'aurai vu un truc dans ce style ..

 

(setq key (getint "\nDiamètre de la canalisation :"))
 (setq key (/ key 1000))

 

et à la suite une commande permettant d'affecter le key / 1000 comme largeur de polyligne

“L'environnement est important, pour sauver un arbre, mangez un castor !”

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é