GJulien Posté(e) le 24 juillet 2015 Posté(e) le 24 juillet 2015 Bonjour à tous, J'ai appris beaucoup de choses depuis mon dernier passage (principalement grâce à la communauté) mais là je coince totalement sur ... les multilignes. Voici le code sur lequel je travaille actuellement (ça m'amuse beaucoup je dois avouer :D)mais sur la dernière partie qui concerne l'import du style de la multiligne, ça ne marche pas du tout et malgré les différentes visites sur différents forums, ça ne m'aide pas plus. Quand je lance la commande MLINE STYLE ... directement à la ligne de commande, ça marche sans problème mais quand j'utilise (command "_MLINE" "STYLE" ...) dans mon code, ça ne marche plus. Je pensais que c'était le "(strcat" qui pouvait créer une erreur mais je ne vois pas pourquoi. Cordialement,GJulien ;; EMR (GJULIEN) ;; Définition des différentes routes d'évacuation avec calques et couleur correspondante. ;; Import des styles de ligne correspondants ;; Import du fichier .mln pour les multilignes ;; Traçage de la multiligne (vl-load-com) (setq ACADOBJ (vlax-get-acad-object)) (setq ACADDOC (vla-get-activedocument ACADOBJ)) ;-------------------------------------------------------------------------------------------------------------- ; Fonction servant à avoir toujours un nombre sur deux positions (ex : "1" devient "01") ;-------------------------------------------------------------------------------------------------------------- (defun-q twoPositions () (if (= 1(strlen emrNbr)) (setq emrNbr (strcat "0" emrNbr)) ) ) ;----------------------------------------------------------------------------------------------------------- ; Les routes étants prédéfinies, stockage de certains numéros sur la même couleur de calque ; Création de la variable "allCol" afin de pouvoir comparer et indiquer une erreur si la route n'existe pas ; - La variable reprend l'ensemble des autres listes "colXXX" ;-------------------------------------------------------------------------------------------------------------- (defun-q mLineCol () (setq colOne '("01" "11" "23" "31" "41" "51" "61" "63" "64" "65" "67")) (setq colTwo '("02" "12" "24" "32" "42" "52" "62" "66" "68")) (setq colThree '("03" "13" "25" "33" "43" "53")) (setq colFour '("04" "14" "26" "34" "44" "54")) (setq colFive '("05" "15" "27" "45" "55")) (setq colSix '("06" "16" "46" "56")) (setq colSeven '("07" "17" "47")) (setq colEight '("08" "18" "48")) (setq colNew '("09" "19")) (setq colTen '("10")) (setq allCol (append colOne colTwo colThree colFour colFive colSix colSeven colEight colNew colTen)) ) ;-------------------------------------------------------------------------------------------------------------- ; Fonction servant à comparer le nombre entré avec les différentes listes et attribuant à la variable ; "layCol" sa couleur correspondante. ;-------------------------------------------------------------------------------------------------------------- (defun-q colCompare () (setq layCol (cond ((car (member emrNbr colOne)) 1) ((car (member emrNbr colTwo)) 3) ((car (member emrNbr colThree)) 4) ((car (member emrNbr colFour)) 5) ((car (member emrNbr colFive)) 6) ((car (member emrNbr colSix)) 8) ((car (member emrNbr colSeven)) 30) ((car (member emrNbr colEight)) 171) ((car (member emrNbr colNew)) 134) ((car (member emrNbr colTen)) 235) ) ) ) ;------------------------------------------------------------------------------------------------------------- ; Initialisation de "emrNbr" (numéro de la route) à zéro pour éviter d'avoir une erreur sur le while ; Appel de la fonction "mLineCol" pour charger les différentes listes et éviter l'erreur surle while également ; Demande à l'utilisateur de rentrer un numéro de route valide. ; - Si la route n'existe pas, donner un message d'erreur et demander un nouveau nombre ; Appel de la fonction "twoPositions" pour la cas ou le nombre entré n'aurait qu'une position (defun C:EMR () (setq emrNbr 0) (mLineCol) (while (= nil (member emrNbr allCol)) (initget 7) (setq emrNbr (itoa (getint "\nEnter the route number : "))) (twoPositions) (if (= nil (member emrNbr allCol)) (alert "Invalid number EMR !! Please enter a correct number.") ) ) ; Appel de la fonction "colCompare" pour attribuer à la variable "layCol" sa couleur correspondante ; Rechercher si le calque "EMR_XX" existe, si ce n'est pas le cas on le créé avec sa bonne couleur ; On rend le calque de la route demandée courant (colCompare) (if (not (tblsearch "LAYER" (strcat "EMR_" emrNbr))) (and (vla-add (vla-get-layers ACADDOC) (strcat "EMR_" emrNbr)) (vla-put-color (vla-item (vla-get-layers ACADDOC) (strcat "EMR_" emrNbr)) layCol) ) ) (setvar "CLAYER" (strcat "EMR_" emrNbr)) ; Rechercher si le style de ligne "EMR_XX" existe, si ce n'est pas le cas on l'importe du fichier .lin ; Quand tout le reste est correct, on importe le style de la multiligne du fichier .mln ; - On établit la justification à zéro (if (not (tblsearch "LTYPE" (strcat "EMR_ROUTE_" emrNbr))) (command "_-LINETYPE" "LOAD" (strcat "EMR_Route_" emrNbr) "Directory\\acadiso.lin" " ") ) (if (= T(member emrNbr allCol)) (command "_MLINE" "STYLE" (strcat "EMR_Route_" emrNbr) (strcat "Directory\\EMR_" emrNbr ".mln") "JUSTIFICATION" "ZERO") ) (princ) ) ;-------------------------------------------------------------------------------------------------------------
GJulien Posté(e) le 6 août 2015 Auteur Posté(e) le 6 août 2015 Bonjour, A défaut de passer par la commande "MLINE -> STYLE -> ...etc, est-ce que quelqu'un aurait une idée de comment importer simplement un style de multiligne (fichier .mln) ? Cordialement,
Patrick_35 Posté(e) le 10 août 2015 Posté(e) le 10 août 2015 Salut Si tu ouvres le fichier mnl, tu remarqueras que ce sont les codes dxf qui sont indiquésAvec ce bout de code trouvé sur le net, tu devrais y arriver. (setq StyleName "TOTO") (dictadd (cdr (cadr (member '(3 . "ACAD_MLINESTYLE") (entget (namedobjdict))))) StyleName (entmakex (list '(0 . "MLINESTYLE") '(100 . "AcDbMlineStyle") (cons 2 StyleName) '(70 . 272) ; End flag '(3 . "") ; StyleDescription '(62 . 256) ; fill color '(51 . 1.5708) ; start angle '(52 . 1.5708) ; end angle '(71 . 3) ; qty elements ; '(49 . 0.25) ; element offset '(62 . 256) '(6 . "BYLAYER") ; Element Linetype '(49 . 0.0) '(62 . 131) '(6 . "KT100") '(49 . -0.25) '(62 . 256) '(6 . "BYLAYER") ) ) ) @+ 1 Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
GJulien Posté(e) le 12 septembre 2015 Auteur Posté(e) le 12 septembre 2015 Merci Patrick et désolé pour la réponse tardive.Je teste ça dès que je reprend le boulot ;)
GJulien Posté(e) le 6 octobre 2015 Auteur Posté(e) le 6 octobre 2015 Bonjour à tous, Déjà merci à toi Patrick_35, j'en ai arraché des cheveux à comprendre comment fonctionne exactement les données DXF avec entmakex mais j'ai aussi beaucoup appris :) Je tiens juste à préciser (des fois que je ne sois pas le seul à ne pas avoir compris et je peux dire que j'ai cherché un bon bout de temps ^^) que les angles des données DXF 51 et 52 sont à donner en radian, contrairement au fichier .mln qui est en degré. Voici le résultat et encore merci. Cordialement, ;; EMR ;; Définition des différentes routes d'évacuation avec calques et couleur correspondante. ;; Import des styles de ligne correspondants ;; Import du fichier .mln pour les multilignes ;; Traçage de la multiligne (vl-load-com) (setq ACADOBJ (vlax-get-acad-object)) (setq ACADDOC (vla-get-activedocument ACADOBJ)) ;-------------------------------------------------------------------------------------------------------------- ; Fonction servant à avoir toujours un nombre sur deux positions (ex : "1" devient "01") ;-------------------------------------------------------------------------------------------------------------- (defun-q twoPositions () (if (= 1(strlen emrNbr)) (setq emrNbr (strcat "0" emrNbr)) ) ) ;----------------------------------------------------------------------------------------------------------- ; Les routes étants prédéfinies, stockage de certains numéros sur la même couleur de calque ; Création de la variable "allCol" afin de pouvoir comparer et indiquer une erreur si la route n'existe pas ; - La variable reprend l'ensemble des autres listes "colXXX" ;-------------------------------------------------------------------------------------------------------------- (defun-q mLineCol () (setq colOne '("01" "11" "23" "31" "41" "51" "61" "63" "64" "65" "67")) (setq colTwo '("02" "12" "24" "32" "42" "52" "62" "66" "68")) (setq colThree '("03" "13" "25" "33" "43" "53")) (setq colFour '("04" "14" "26" "34" "44" "54")) (setq colFive '("05" "15" "27" "45" "55")) (setq colSix '("06" "16" "46" "56")) (setq colSeven '("07" "17" "47")) (setq colEight '("08" "18" "48")) (setq colNew '("09" "19")) (setq colTen '("10")) (setq allCol (append colOne colTwo colThree colFour colFive colSix colSeven colEight colNew colTen)) ) ;-------------------------------------------------------------------------------------------------------------- ; Fonction servant à comparer le nombre entré avec les différentes listes et attribuant à la variable ; "layCol" sa couleur correspondante. ;-------------------------------------------------------------------------------------------------------------- (defun-q colCompare () (setq layCol (cond ((car (member emrNbr colOne)) 1) ((car (member emrNbr colTwo)) 3) ((car (member emrNbr colThree)) 4) ((car (member emrNbr colFour)) 5) ((car (member emrNbr colFive)) 6) ((car (member emrNbr colSix)) 8) ((car (member emrNbr colSeven)) 30) ((car (member emrNbr colEight)) 171) ((car (member emrNbr colNew)) 134) ((car (member emrNbr colTen)) 235) ) ) ) ;------------------------------------------------------------------------------------------------------------- ; Initialisation de "emrNbr" (numéro de la route) à zéro pour éviter d'avoir une erreur sur le while ; Appel de la fonction "mLineCol" pour charger les différentes listes et éviter l'erreur surle while également ; Demande à l'utilisateur de rentrer un numéro de route valide. ; - Si la route n'existe pas, donner un message d'erreur et demander un nouveau nombre ; Appel de la fonction "twoPositions" pour la cas ou le nombre entré n'aurait qu'une position (defun C:EMR () (setq emrNbr 0) (mLineCol) (while (= nil (member emrNbr allCol)) (initget 7) (setq emrNbr (itoa (getint "\nEnter the route number : "))) (twoPositions) (if (= nil (member emrNbr allCol)) (alert "Invalid number EMR !! Please enter a correct number.") ) ) ; Appel de la fonction "colCompare" pour attribuer à la variable "layCol" sa couleur correspondante ; Rechercher si le calque "EMR_XX" existe, si ce n'est pas le cas on le créé avec sa bonne couleur ; On rend le calque de la route demandée courant (colCompare) (if (not (tblsearch "LAYER" (strcat "EMR_" emrNbr))) (and (vla-add (vla-get-layers ACADDOC) (strcat "EMR_" emrNbr)) (vla-put-color (vla-item (vla-get-layers ACADDOC) (strcat "EMR_" emrNbr)) layCol) ) ) (setvar "CLAYER" (strcat "EMR_" emrNbr)) ; Rechercher si le style de ligne "EMR_XX" existe, si ce n'est pas le cas on l'importe du fichier .lin ; On initialise Celtscale pour mettre à l'échelle le type de ligne sur les nouveaux objets créés ; On ajoute le style de multiligne au dictionnaire >>(DICTADD MLINESTYLE) ; On gère les 3 paramètres de la création de la multiligne avant de la tracer (if (not (tblsearch "LTYPE" (strcat "EMR_ROUTE_" emrNbr))) (vl-cmdf "_-LINETYPE" "LOAD" (strcat "EMR_Route_" emrNbr) "DIRECTORY\\acadiso.lin" "") ) (if (= emrNbr (car (member emrNbr allCol))) (progn (setq oldCeltscale (getvar "CELTSCALE")) (setvar "CELTSCALE" 60) ;DICTADD MLINESTYLE (setq styleName (strcat "EMR_Route_" emrNbr)) (dictadd (cdr (cadr (member '(3 . "ACAD_MLINESTYLE") (entget (namedobjdict))))) styleName (entmakex (list '(0 . "MLINESTYLE") '(100 . "AcDbMlineStyle") (cons 2 styleName) '(70 . 273) '(3 . "") '(62 . 256) '(51 . 1.5708) '(52 . 1.5708) '(71 . 3) '(49 . 250.00) '(62 . 256) '(6 . "BYLAYER") '(49 . 0.0) '(62 . 0) (cons 6 styleName) '(49 . -250.00) '(62 . 256) '(6 . "BYLAYER") ) ) ) (vl-cmdf "_MLINE" "JUSTIFICATION" "ZERO" "SCALE" "1" "STYLE" styleName) ) (princ) ) (princ) ) NB : J'ai bien sûr auparavant créé mon fichier *.lin avec des définitions des styles de ligne.
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant