guyc64 Posté(e) le 13 février 2012 Posté(e) le 13 février 2012 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.
VDH-Bruno Posté(e) le 13 février 2012 Posté(e) le 13 février 2012 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
guyc64 Posté(e) le 13 février 2012 Auteur Posté(e) le 13 février 2012 Merci,Je vais essayer cela ce soir, sa semble répondre parfaitement à mon problème.Encore merci.
guyc64 Posté(e) le 14 février 2012 Auteur Posté(e) le 14 février 2012 Salut,je viens d'essayer et c'est parfait, exactement ce qu'il me fallait. J'ai pris bonne note de ton Ps. et retirer le code 100 de ma selection.Bravo.
guyc64 Posté(e) le 28 février 2012 Auteur Posté(e) le 28 février 2012 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"etDimldrblk = "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.
VDH-Bruno Posté(e) le 28 février 2012 Posté(e) le 28 février 2012 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
guyc64 Posté(e) le 29 février 2012 Auteur Posté(e) le 29 février 2012 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
VDH-Bruno Posté(e) le 29 février 2012 Posté(e) le 29 février 2012 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
guyc64 Posté(e) le 1 mars 2012 Auteur Posté(e) le 1 mars 2012 Salut VDH-Bruno,En plein dans le mille, pour une rasison ou une autre le style est "Dot" dans certain cas et "DOT" dans d'autre.Merci mille fois pour l'éclaircissement et ton temps. :D
VDH-Bruno Posté(e) le 1 mars 2012 Posté(e) le 1 mars 2012 Merci mille fois pour l'éclaircissement et ton tempsCe 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
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