Aller au contenu

ACAD_PLOTSTYLENAME


tyrese69_

Messages recommandés

Bonjour à tous,

 

Avec le LISP il est possible de lire les PLOTSTYLES d'un fichier avec STB !

 

' (setq root (entget (namedobjdict)))

' (setq ed (entget (cdr (cadr (member '(3 . "ACAD_PLOTSTYLENAME") root)))))

'

'

' ((-1 . <Nom d'entité: 7ed2ec30>) (0 . "ACDBDICTIONARYWDFLT") (5 . "6") (102 . "{ACAD_REACTORS")

' (330 . <Nom d'entité: 7ed2ec38>) (102 . "}")

' (330 . <Nom d 'entité: 7ed2ec38>) (100 . "AcDbDictionary") (280 . 0) (281 . 1)

' (3 . "Gris") (350 . <Nom d'entité: 7ed29e88>)

' (3 . "Normal") (350 . <Nom d'entité: 7ed2ec28>)

' (3 . "Style_1") (350 . <Nom d'entité: 7ed36a40>)

' (3 . "Style_2") (350 . <Nom d'entité: 7ed34cd0>)

' (100 . "AcDbDictionaryWithDefault") (340 . <Nom d'entité: 7ed2ec28>))

 

1 ere question comment extraire de cette liste les valeurs assoc 3 des styles ? (en lisp)

2 nde question En VBA comment lire ces même valeurs ?

 

Daniel OLIVES

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

1) En LISP, je te propose une fonction générique qui retourne toutes les entrées d'un dictionnaire sous forme de paires pointées : (clé . ename).

 

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

 

tu peux utiliser cette routine pour retrouver l'entrée "ACAD_PLOTSTYLENAME" dans le dictionnaire racine puis pour retrouver toutes les entrées de ce dictionnaire :

(gc:GetDictEntries (cdr (assoc "ACAD_PLOTSTYLENAME" (gc:GetDictEntries (namedobjdict)))))

 

Si tu ne veux que les nom (clés)

(mapcar 'car (gc:GetDictEntries (cdr (assoc "ACAD_PLOTSTYLENAME" (gc:GetDictEntries (namedobjdict))))))

 

2) en VBA je ne pourrais pas trop t'aider (je ne connais pas). À mon avis, les dictionnaires sont plus faciles à manipuler en "pur LISP" (via DXF) qu'avec l'API COM/activeX.

 

ThisDrawing.Dictionaries.Item("ACAD_PLOTSTYLENAME")

devrait retourner le dictionnaire, ensuite avec une boucle For ou For Each tu devrais pouvoir retrouver les entrées.

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

Lien vers le commentaire
Partager sur d’autres sites

Re bonjour,

 

Voici ce que cela donne en mix LISP et VBA via le VLAX :

 

Dim repCTB As String

Dim vl As New VLAX

Set vl = Nothing

repCTB = vl.EvalLispExpression("(setq sPathCTB sPathCTB)")

'*********************************************************************************

 

' Si PSTYLEPOLICY = 1 (CTB) alors DEFLPLSTYLE = "PARCOULEUR"

' Si PSTYLEPOLICY = 0 (STB) alors DEFLPLSTYLE = "NORMAL"

'

Set objElem = ThisDrawing.Layers

' nombre de calques

Cpt1 = objElem.Count

 

ThisDrawing.SendCommand ("Lstyles") & vbCrLf

Dim Val1Style As Variant

 

Val1Style = vl.GetLispList("(setq LSTYLplot (mapcar 'car (gc:GetDictEntries (cdr (assoc ""ACAD_PLOTSTYLENAME"" (gc:GetDictEntries (namedobjdict)))))))")

 

Dans la variable Val1Style se trouvent les valeurs des "PlotStyle"

 

daniel OLIVES

Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...
  • 2 ans après...

Re bonjour,

Aprés pas mal de temps j'ai une question sur ce sujet

 

Comment récupérer la paire "Nom du style" et "Couleur"

 

("Normal" . 160) pour chaque style du m^me dictionnaire

 

J'ai un peut perdu mes bases de lisp

 

Daniel OLIVES

TPS membre de WSP

Lien vers le commentaire
Partager sur d’autres sites

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é