Aller au contenu

lisp pour remplacer des multilignes par d\'autres ML


Messages recommandés

Posté(e)

hello,

je souhaite remplacer des ML (des tubes) par d'autres ML (des tubes composés de lignes discontinues - car les tubes sont cachés)

je souhaiterai sélectionné pls ML et que le lisp me demande le nouveau type de ML pour le changement...

si vous avez des conseils n'hésitez pas, je sais qu'il faut que je franchisse le pas et que je me mette à la prog (je commence de zéro ou presque - j'arrive à peu près à lire un programme, c'est tout!! :)

++

phil

 

PS : @autodesk : encore merci pour la rigidité des ML lors de leurs manipulations :usineàgaz:

Projeteur Revit Indépendant - traitement des eaux/CVC

Posté(e)

PS : @autodesk : encore merci pour la rigidité des ML lors de leurs manipulations :usineàgaz:

 

Une vrai connerie cette histoire de multiligne...

 

J'ai tout essayé impossible de changé le style d'une multi-ligne..

 

Si un dieu du lisp nous écoute...

DAO: AutoCAD(2D & 3D), Covadis

CAO: 3D's MAX, Rhinoceros 3D, REVIT

GeoModeliSation: AutoCAD MEP, RhinoTerrain

Rendu: Vray for Rhino, Keyshot, Lumion

Programmation: Grasshopper, Dynamo, VisualStudio

 

C.V.

Profil LinkedIn

Book

Site web

 

http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg

Posté(e)

Salut,

 

Le style des multilignes est en lecture seule en AutoLISP ou Visual LISP comme dans les propriétés d'AutoCAD.

Comme je trouvais ça un peu démesuré de faire une commande en .NET, j'ai essayé de contourner le problème en recréant une nouvelle multiligne avec les mêmes propriétés (et xdata s'il y en a) dans le style choisi et de supprimer l'ancienne.

 

Nouvelle version (pas testée en profondeur)

 

;; Commande
(defun c:CMLS (/ *error* echo osnp slst ss styl ent)
 (vl-load-com)
 (defun *error* (msg)
   (or	(not msg)
(= msg "Fonction annulée")
(princ (strcat "Erreur: " msg))
   )
   (setvar 'cmdecho echo)
   (setvar 'osmode osnp)
   (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
   (princ)
 )
 (setq	echo (getvar 'cmdecho)
osnp (getvar 'osmode)
slst (gc:GetDictEntries (dictsearch (namedobjdict) "ACAD_MLINESTYLE"))
 )
 (if
   (and
     (setq n  -1
    ss (ssget '((0 . "MLINE")))
     )
     (setq styl (gc:ListBox "Styles de multiligne" "Choisissez un style" (mapcar 'car slst) 0))
   )
    (progn
      (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
      (setvar 'cmdecho 0)
      (setvar 'osmode 0)
      (while (setq ent (ssname ss (setq n (1+ n))))
 (setq elst (entget ent))
 (vl-cmdf "_.mline" "_style" styl)
 (mapcar '(lambda (x)
	    (vl-cmdf (trans x 0 1))
	  )
	 (massoc 11 elst)
 )
 (vl-cmdf (if (= 2 (logand 2 (cdr (assoc 71 elst))))
	    "_close"
	    ""
	  )
 )
 (if (setq xd (assoc -3 (entget ent '("*"))))
   (entmod (append (entget (entlast)) (list xd)))
 )
 (entdel ent)
      )
    )
 )
 (*error* nil)
)

;; gc:ListBox (gile)
;; Boite de dialogue permettant un ou plusieurs choix dans une liste
;;
;; Arguments
;; title : le titre de la boite de dialogue (chaîne)
;; msg ; message (chaîne), "" ou nil pour aucun
;; lbls : une liste de chaînes (sans doublons)
;; flag : 0 = liste déroulante
;;        1 = liste choix unique
;;        2 = liste choix multipes
;;
;; Retour : l'option (flag = 0 ou 1) ou la liste des options (flag = 2)
;;
;; Exemple d'utilisation
;; (listbox "Présentation" "Choisir une présentation" (layoutlist) 1)

(defun gc:ListBox (title msg lbls flag / tmp file dcl_id choice)
 (setq	tmp  (vl-filename-mktemp "tmp.dcl")
file (open tmp "w")
 )
 (write-line
   (strcat "ListBox:dialog{label=\"" title "\";")
   file
 )
 (if (and msg (/= msg ""))
   (write-line (strcat ":text{label=\"" msg "\";}") file)
 )
 (write-line
   (cond
     ((= 0 flag) "spacer;:popup_list{key=\"lst\";")
     ((= 1 flag) "spacer;:list_box{key=\"lst\";")
     (T "spacer;:list_box{key=\"lst\";multiple_select=true;")
   )
   file
 )
 (write-line "}spacer;ok_cancel;}" file)
 (close file)
 (setq dcl_id (load_dialog tmp))
 (if (not (new_dialog "ListBox" dcl_id))
   (exit)
 )
 (start_list "lst")
 (mapcar 'add_list lbls)
 (end_list)
 (action_tile
   "accept"
   "(or (= (get_tile \"lst\") \"\")
   (if (= 2 flag) (progn
   (foreach n (gc:str2lst (get_tile \"lst\") \" \")
   (setq choice (cons (nth (atoi n) lbls) choice)))
   (setq choice (reverse choice)))
   (setq choice (nth (atoi (get_tile \"lst\")) lbls))))
   (done_dialog)"
 )
 (start_dialog)
 (unload_dialog dcl_id)
 (vl-file-delete tmp)
 choice
)

;; gc:str2lst
;; Transforme un chaine avec séparateur en liste de chaines
;;
;; Arguments
;; str : la chaine à transformer en liste
;; sep : le séparateur
;;
;; Exemples
;; (str2lst "a b c" " ") -> ("a" "b" "c")
;; (str2lst "1,2,3" ",") -> ("1" "2" "3")
;; (mapcar 'read (str2lst "1,2,3" ",")) -> (1 2 3)

(defun gc:str2lst (str sep / pos)
 (if (setq pos (vl-string-search sep str))
   (cons (substr str 1 pos)
  (gc:str2lst (substr str (+ (strlen sep) pos 1)) sep)
   )
   (list str)
 )
)

;; gc:GetDictEntries
;; Retourne la liste des entrées du dictionnaire
;; sous forme de paires pointées (Nom . ENAME)
;;
;; Argument : dict le dictionnaire (ENAME ou liste DXF)

(defun gc:GetDictEntries (dict / result)
 (and (= (type dict) 'ENAME) (setq dict (entget dict)))
 (while
   (setq dict (vl-member-if (function (lambda (x) (= (car x) 3))) (cdr dict)))
    (setq result (cons (cons (cdar dict) (cdadr dict)) result))
 )
 (reverse result)
)

;; massoc
;; Retourne la liste de toutes les valeurs pour le code spécifié
;; dans une liste d'association
;;
;; Arguments
;; code : le code de groupe pour les entrées
;; alst : la liste d'association

(defun massoc (code alst)
 (if (setq alst (member (assoc code alst) alst))
   (cons (cdar alst) (massoc code (cdr alst)))
 )
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

 

Hello Gilles

 

Je crois qu'il faut rajouter un bon vieux

(vl-load-com)

en debut de cette routine VLisp

 

et sinon sous MAP avec mes OD (Object Data), je fais quoi ?

 

Merci d'avance, Le Decapode

 

Autodesk Expert Elite Team

Posté(e)

 

Hello

 

Je viens de tester (plus en profondeur) sous MAP 2006 et MAP 2009 et je pensais que la routine fonctionnait correctement mais en fait il y a un Bug ou alors c'est une limitation de ces foutues MLines d'AutoCAD

 

Soit un style de ML nomme "C2" avec 2 lignes de couleur bleue

et un autre nomme "C4" avec 4 lignes de couleur verte

 

Les C2 passent bien en C4 MAIS restent sous la forme de DEUX lignes, pourquoi ?

et vice versa !

 

Le Decapode

 

 

 

Autodesk Expert Elite Team

Posté(e)

Salut,

 

Effectivement ça semble beaucoup plus complexe que ce que je pensais...

J'essayerais d'y revenir si j'ai le temps, mais je ne suis pas trop motivé : je n'utilise jamais de multilignes...

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour (gile) et merci pour ton lisp qui marche...

 

enfin qui fait ce que je lui demande (ie passer des ML trait plein à des ML en pointillés)

le problème c'est que le lisp ne fait que ça (la transfo en pointillés), j'ai une cana en DN150 TP(trait plein) que je souhaite passer en cana DN150 P(pointillé) et ça marche, mais si je lui demande de changer cette même cana DN150 TP en cana DN20 P on a le même résult&at visuel, la cana DN20 P à la même taille qu'une cana DN150 P alors que l'échelle de la ML est resté 1

 

bref, quand je disais que je souhaiterai réaliser un tel programme j'ai peut être été un peu vaniteux (rien que lire ce programme est compliqué!!)

 

ce qu'il faudrait que le logiciel fasse (et que j'essaie de faire :mad2:) c'est :

- demander une sélection de ML (ça je dois pvr le trouver dans ton lisp (gile))

- prendre les coordonnées de chaque extrémités de ces ML

- effacer les anciennes ML

- créer les nouvelles ML à partir des coordonnées récupérées et du nouveau type de ML choisis

 

pour l'instant je bute sur l'étape 2, les coordonnées

 

je vous tiens au courant dans la soirée pour les autres éléments qui me manqueraient (je ne travaille sur le lisp que le soir après le travail)

 

++

Phil - lispeur débutant

Projeteur Revit Indépendant - traitement des eaux/CVC

Posté(e)

 

Hello Gilles

 

Je n'ai qu'un MAP 2004 a disposition pour ce WE mais en tout cas, ta nouvelle routine CMLS.lsp semble fonctionner Nickel-Chrome ! :)

 

Pour bien tester et valider, il faut absolument au moins 2 styles de MLine (avec un nombre de ligne different) et des terminaisons differentes et eventuellement des couleurs forcees sur les lignes differents ! :exclam:

 

Si quelqu'un pouvait tester et valider avec un AutoCAD 2010/2011, ca serait sympa !?

 

Bon WE, Le Decapode

 

Autodesk Expert Elite Team

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é