Aller au contenu

Filtrer l'objet -Flèche- et -Point- ect... (Dimlk)


guyc64

Messages recommandés

Bonjour,

 

Excuser les termes anglais, juste que j'utilise la version US d'autocad V2012.

J'aimerais connaître la façon de filtrer (ou sélectionner) un type de "leader" défini. Ex.: pour les dimensions je fais un:

 

(ssget "_x" (list (cons 0 "DIMENSION")(cons 100 "AcDbDimension")))

 

Et pour l'identification je fais:

 

(ssget "_x" (list (cons 0 "LEADER")(cons 100 "AcDbLeader")))

 

mais je n'arrive pas à faire la distinction entre une pointe de flèche "closed filled" ou un point "dot" ou un point vide "dot blank" ou tout autre type "arrow head".

 

En fait j'aimerais pouvoir filtrer chaque élément en fonction de l'objet choisi sous les variables "Dimblk1" et "Dimblk2" et selon qu'il soit utilisé pour une "Dimension" (command "_dimlinear", ect.) ou un "Leader" (command "qleader", ect.).

 

Je cherche et ne trouve absolument rien.

 

Merci pour votre aide.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Je vais te faire une réponse en fonction de ce que je crois avoir compris, les lignes de codes suivantes sont données à titre indicatif, je te laisse le soin de les optimiser et de les adapter à ton cas.

 

Si tu es certain que les blocs des styles de cotes n’ont pas été forcé, tu peux y arriver en filtrant les styles de cote définie avec le bloc recherché, pour construire la liste de filtre il te faut explorer la table des styles de cotations.

 

L’expression suivante retourne la sélection des cotes ayant le bloc "ARCHTICK" (saisir "_ARCHTICK" sur une version anglaise il me semble)

(ssget (list '(0 . "DIMENSION,LEADER") (cons 3  (lst2str (StyleCot "ARCHTICK") ","))))

 

Les routines associés

;; Renvoie la liste des styles de cotation (DIMSTYLE)
;; dont la définition possède le type de bloc spécifié Dimblk.
(defun StyleCot	(Dimblk / DimStyle NameStyle)  
 (while (setq DimStyle (tblnext "DIMSTYLE" (not DimStyle)))
   (if (member Dimblk
      (if (zerop (cdr (assoc 173 DimStyle)))
	(list (cdr (assoc 5 DimStyle)))
	(list (cdr (assoc 6 DimStyle)) (cdr (assoc 7 DimStyle)))
      )
       )

      (setq NameStyle (cons (cdr (assoc 2 DimStyle)) NameStyle))
   )
 )
 NameStyle
)

;; LST2STR (gile)
;; Concatène une liste et un séparateur en une chaine
;;
;; Arguments
;; lst : la liste à transformer en chaine
;; sep : le séparateur
;;
;; Exemples
;; (lst2str '(1 2 3) ",") -> "1,2,3"
;; (lst2str '("a" "b" "c") " ") -> "a b c"

(defun lst2str (lst sep)
 (if (cadr lst)
   (strcat (vl-princ-to-string (car lst))
    sep
    (lst2str (cdr lst) sep)
   )
   (vl-princ-to-string (car lst))
 )
)

 

Sinon on peut également filtrer le jeu de sélection après coup et ne garder que les cotations du type désiré, de plus en travaillant directement sur les propriétées ArrowheadBlock Arrowhead1Block Arrowhead2Block avec ActiveX, on prend bien en compte la cotations et plus son style, donc il n'y a plus de soucis avec les objets modifié.

Exemple de code (toujours pour retourner la sélection des cotes ayant le bloc "ARCHTICK") :

(selection (ssget "_X" '((0 . "DIMENSION,LEADER"))) "ARCHTICK")

 

La routines associés

(defun selection (ss Dimblk / ss1 obj ent i)
 (setq ss1 (ssadd))
 (repeat (setq i (sslength ss))
   (cond
     ((vlax-property-available-p
 (setq obj (vlax-ename->vla-object
	     (setq ent (ssname ss (setq i (1- i))))
	   )
 )
 'ArrowheadBlock
      )
      (if (= (vla-get-ArrowheadBlock obj) Dimblk)
 (ssadd ent ss1)
      )
     )
     (T
      (if (member Dimblk
	   (list (vla-get-Arrowhead1Block obj)
		 (vla-get-Arrowhead2Block obj)
	   )
   )
 (ssadd ent ss1)
      )
     )
   )
 )
 ss1
)

 

Ps : Il ne sert à rien de filtrer sur les codes 100 ce sont des marqueurs de sous classes ignorés dans les filtres de sélection.

 

Cordialement

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Salut,

Je me rends compte que la fonction (selection)décrit plus haut

(Defun selection ss Dimblk / ss1 obj ent i)

(setq ss1 ....

ect...

est parfaite à une exception près, c'est à dire qu'elle passe à côté (n'isole pas) lorsque:

Dimblk = "None"

Dimblk1 = "None"

Dimblk2 = "None"

et

Dimldrblk = "Dot"

Je comprends qu'elle ne l'isole pas puisque la fonction recherche la valeur des variables DimBlk, DimBlk1 et DimBlk2 mais comment faire pour inclure dans la recherche la variable DimLdrBlk.

Encore une fois merci de votre aide.

Guy.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Alors très rapidement, j’ai hélas peu de temps..

Je comprends qu'elle ne l'isole pas puisque la fonction recherche la valeur des variables DimBlk, DimBlk1 et DimBlk2 mais comment faire pour inclure dans la recherche la variable DimLdrBlk.

Encore une fois merci de votre aide.

 

La fonction recherche bien DimLdrBlk (Propriété ArrowheadBlock pour les lignes de repères) dans le code posté précédement, sauf qu’elle utilise la même valeur de filtre que pour DimBlk1 et DimBlk2 (Propriété Arrowhead1Block et Arrowhead2Block).

 

Pour inclure une recherche spécifique sur DimLdrBlk, il suffit de créer un argument suplémentaire à la fonction selection, permettant à cette dernière de filtrer de manière spécifique la propriété ArrowheadBlock.

 

Le code modifié à voir si il correspond à ton besoin..

(defun selection (ss Dimblk Dimldrblk / ss1 obj ent i)
 (setq ss1 (ssadd))
 (repeat (setq i (sslength ss))
   (cond
     ((vlax-property-available-p
        (setq obj (vlax-ename->vla-object
                    (setq ent (ssname ss (setq i (1- i))))
                  )
        )
        'ArrowheadBlock
      )
      (if (= (vla-get-ArrowheadBlock obj) Dimldrblk)
        (ssadd ent ss1)
      )
     )
     (T
      (if (member Dimblk
                  (list (vla-get-Arrowhead1Block obj)
                        (vla-get-Arrowhead2Block obj)
                  )
          )
        (ssadd ent ss1)
      )
     )
   )
 )
 ss1
)

 

Pour tester en fonction de tes critères

(selection (ssget "_X" '((0 . "DIMENSION,LEADER"))) "None" "Dot")

 

A+

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Merci Bruno,

 

Je me rends compte que sa fonctionne très bien avec comme paramétre "DotBlank" (présent également dans le dessin) mais rien à faire avec "Dot". Impossible de filtrer sur "Dot".

Dans le cote je remplace "Dot" par "DotBlank" et le programme filtre sur les "DotBlank" présent dans le dessin.

Je comprends foutument pas pourqu'elle raison sa ne fonctionne pas avec "Dot". J'essaye de toute les façons possible et immaginable mais j'amais il filtre sur "Dot".

 

Là, je suis complètement crevé je vais revenir sur cela plus tard.

Je joins le fichier en question (simple fichier avec des flèches, des points et points vides).

Test-01.txt -> Test-01.dwg

 

Guy.

Test-01.txt

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Rien de bien méchant juste un problème de casse dans le nom de symbole, dans ton dessin "dot" s’écrit "DOT", pour t’en convaincre tu lance la commande d’insertion des blocs et tu regardes ceux qui sont définie dans le dessin.

 

Sinon tu fais sur la ligne de repère qui pose problème.

(vlax-dump-object (vlax-ename->vla-object (car (entsel))) T)

Et dans la console VLisp tu recherche la propriété :

;   ….
;   ArrowheadBlock = "DOT"
;   ….

 

Tu peux intégrer la fonction lisp strcase dans le code mais je conseillerai plutôt de sélectionner comme ceci :

(selection (ssget "_X" '((0 . "DIMENSION,LEADER"))) "None" "DOT")

 

Le problème venant de ton style de cotation, pour t’en convaincre crée un nouveau style et affecte lui le bloc "dot" et celui-ci sera ajouté à la base de ton dessin.

 

Cordialement,

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Merci mille fois pour l'éclaircissement et ton temps

Ce fut un plaisir et pour ce qui est du temps disons que je m’efforce de rendre (dans la mesure de mes moyens) un peu de celui que d’autres sur le forum ont bien voulu m’accorder :)

A+

Apprendre => Prendre => Rendre

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é