Aller au contenu

Remplacer blocs/entmake


Messages recommandés

Posté(e)

Salut,

je viens d'écrire "vite-fait" un petit lisp permettant de remplacer un bloc par un aute (à la manière de l'express mais pour un bloc unique)...

J'ai voulu apprendre à utiliser (entmake) et je suis embêter, car comme je m'en doutait il faut que le bloc "remplaçant" soit déjà inserer dans le plan pour que ça fonctionne...

Y aurait t'il une astuce "propre" pour que ça fonctionne sans que ce bloc soit présent dans le dessin (je sais qu'en vl- c'est possible, mais je test le entmake....)

 

 (defun c:bbb (/ bloc_sel List_Info_Bloc bloc_sel2 bloc_R)
 (princ "\n------------------------------\n Sélection du Bloc à Remplacer :")  
 (while (= bloc_sel nil)
     (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT")))))

 (setq List_Info_Bloc (append (list (cdr (assoc 2 (entget (ssname bloc_sel 0)))))  ;nom 0
		       (list (cdr (assoc 8 (entget (ssname bloc_sel 0)))))  ;calque 1
		       (list (cdr (assoc 10 (entget (ssname bloc_sel 0))))) ; pt insert 2
		       (list (cdr (assoc 41 (entget (ssname bloc_sel 0))))) ; ech x 3
		       (list (cdr (assoc 42 (entget (ssname bloc_sel 0))))) ; ech y 4
		       (list (cdr (assoc 43 (entget (ssname bloc_sel 0))))) ; ech z 5
		       (list (cdr (assoc 50 (entget (ssname bloc_sel 0)))))); rot (radian) 6
)  
 (setq bloc_R (getstring "\n Entrez le nom du bloc Remplaçant ou : "))
 (if (= bloc_R "")(progn
	     (while (= bloc_sel2 nil)
	       (setq bloc_sel2 (ssget "_:S:E" '((0 . "INSERT")))))
	     (setq bloc_R (cdr (assoc 2 (entget (ssname bloc_sel2 0)))))))
 
(entdel (ssname bloc_sel 0))   
;;;; Fonctionne si 1 bloc au moins inséré
(entmake (list (cons 0 "INSERT")
	(cons 2 bloc_R)
	(cons 8 (nth 1 List_Info_Bloc))
	(cons 10 (nth 2 List_Info_Bloc))
	(cons 41 (nth 3 List_Info_Bloc))
	(cons 42 (nth 4 List_Info_Bloc))
	(cons 43 (nth 5 List_Info_Bloc))
	(cons 50 (nth 6 List_Info_Bloc)))
  )
 )

 

(le code peut être certainement simplifié, mais c'est un premier "jeté"...)

 

... merci d'avance.

 

-------------------------------------------------------------------

Pour info, la version (simplifié) en -vl :

 (defun c:bbb (/ bloc_sel bloc_R)
 (princ "\n------------------------------\n Sélection du Bloc à Remplacer :")  
 (while (= bloc_sel nil)
     (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT")))))
 
 (setq bloc_R (getstring "\n Entrez le nom du bloc Remplaçant ou : "))
 (if (= bloc_R "")(progn
	     (while (= bloc_R "")
	       (setq bloc_R (ssget "_:S:E" '((0 . "INSERT")))))
	     (setq bloc_R (cdr (assoc 2 (entget (ssname bloc_R 0)))))))  
   
 (vla-put-layer (vla-InsertBlock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
 (vlax-3d-point (cdr (assoc 10 (entget (ssname bloc_sel 0)))))
	   (findfile (strcat bloc_R ".dwg" ))
	   (cdr (assoc 41 (entget (ssname bloc_sel 0))))
	   (cdr (assoc 42 (entget (ssname bloc_sel 0))))
   		   (cdr (assoc 43 (entget (ssname bloc_sel 0))))
   		   (cdr (assoc 50 (entget (ssname bloc_sel 0)))))
   		(cdr (assoc 8 (entget (ssname bloc_sel 0)))))
 (entdel (ssname bloc_sel 0))    
   )

 

 

 

 

[Edité le 18/7/2006 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut

pour construire un bloc en autolisp

Définition du bloc

(entmake (list (cons 0 "block")
                  (cons 2 "MON_BLOC")
                  (cons 70 64)
                  (cons 10 '(0.0 0.0 0.0))))

Des lignes, texte, etc... qui contituent le bloc

(entmake (list (cons 0 "LINE")
                            (cons 100 "AcDbEntity")
                            (cons 10 '(0.0 0.0 0.0))
                            (cons 11 '(10.0 0.0 0.0))))
        (entmake (list (cons 0 "TEXT")
                            (cons 100 "AcDbEntity")
                            (cons 100 "AcDbText")
                            (cons 40 2.5)
                            (cons 72 1)
                            (cons 73 2)
                            (cons 10 '(0.0 0.0 0.0))
                            (cons 1 "TEXTE")))

et pour dire que le bloc est fini

(entmake '((0 . "endblk")))

 

@+

 

[Edité le 18/7/2006 par Patrick_35]

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Salut,

 

Si j'ai bien compris, tu ne change que le nom du bloc en gardant tous ses composants.

 

Voici un exemple qui crée une nouvelle définition de bloc comme indiqué par Patrick_35 et qui l'insère à la place du bloc sélectionné :

 

(defun c:bbb (/ bloc_sel bloc_lst)
 (princ
   "\n------------------------------\n Sélection du Bloc à Remplacer :"
 )
 (while (= bloc_sel nil)
   (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT"))))
 )
 (setq bloc_R (getstring "\n Entrez le nom du bloc Remplaçant: "))
 (while (tblsearch "BLOCK" bloc_R)
   (setq
     bloc_R (getstring
       (strcat
	 "\n Le bloc : \""
	 bloc_R
	 "\" existe déjà.\nEntrez le nom du bloc Remplaçant: "
       )
     )
   )
 )
 (setq
   old_bloc (tblsearch	"BLOCK"
		(cdr (assoc 2 (entget (ssname bloc_sel 0))))
     )
 )
 (setq new_bloc (subst (cons 2 bloc_R) (assoc 2 old_bloc) old_bloc))
 (setq ent (cdr (assoc -2 old_bloc)))
 (while ent
   (setq ent_lst (cons (entget ent) ent_lst)
  ent	  (entnext ent)
   )
 )
 (entmake new_bloc)
 (mapcar 'entmake (reverse ent_lst))
 (entmake '((0 . "ENDBLK")))
 (entmake (subst (cons 2 bloc_R)
	  (assoc 2 (entget (ssname bloc_sel 0)))
	  (entget (ssname bloc_sel 0))
   )
 )	
 (entdel (ssname bloc_sel 0))
 (princ)
) 

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

Posté(e)

merci à vous 2, je vais regarder ça...

(gile), au premier test ta routine n'a pas l'air de fonctionner...

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

au premier test ta routine n'a pas l'air de fonctionner...

 

Il me semble plutôt que je n'ai pas compris ta demande (le LISP ci-dessus ne fait que changer le nom du bloc)

 

S'il s'agit de remplacer une référence de bloc par une autre, ça serait plutôt ce genre là :

(la définition de bloc doit exister dans le dessin, même si aucune référence n'est insérée. On teste avec tblsearch)

 

(defun c:bbb (/ bloc_sel List_Info_Bloc bloc_r bloc_sel2)
 (princ
   "\n------------------------------\n Sélection du Bloc à Remplacer :"
 )
 (while (= bloc_sel nil)
   (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT"))))
 )
 (setq	List_Info_Bloc
 (vl-remove-if-not
   '(lambda (x) (member (car x) '(8 10 41 42 43 50)))
   (entget (ssname bloc_sel 0))
 )
 )
 (while (or (not bloc_R) (not (tblsearch "BLOCK" bloc_R)))
   (setq bloc_R
   (getstring
     "\n Entrez le nom du bloc Remplaçant ou : "
   )
   )
   (if	(= bloc_R "")
     (progn
(while (= bloc_sel2 nil)
  (setq bloc_sel2 (ssget "_:S:E" '((0 . "INSERT"))))
)
(setq bloc_R (cdr (assoc 2 (entget (ssname bloc_sel2 0)))))
     )
   )
 )
 (entmake (append (list (cons 0 "INSERT") (cons 2 bloc_R)) List_Info_Bloc))	
 (entdel (ssname bloc_sel 0))
 (princ)
)

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

Posté(e)

merci (gile), mais tu reposes la question de mon sujet dans ton lisp ...

 

(la définition de bloc doit exister dans le dessin, même si aucune référence n'est insérée. On teste avec tblsearch)

 

... d'accord ton lisp permet d'éviter l'erreur, mais je cherchais en fait le moyen avec entmake de pouvoir insérer un bloc même si il n'est pas dans le dessin...

 

(je le réussis en -vl, mais comme c'est la première fois que j'utilise entmake, je voulais savoir si il y avait une possibilité simple de palier à ce problème...)

 

merci en tout cas de perdre du temp sur mes soucis...

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Il me semble qu'on ne peut pas insérer un wbloc avec entmake, le code de groupe 2 est celui du nom du bloc, et n'accepte pas de chemin vers un fichier .dwg.

 

Je ne vois de possibilités qu'avec (command "_.insert" ...) ou (vla-InsertBlock ...).

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

Posté(e)

Daco'Dac !...

merci à vous deux, je passerais donc en -vl...

mais ça m'aura permis de toucher du doigt entmake...

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut,

j'ai legerment modifier la proposition de (gile) afin d'avoir le choix de choisir de modifier plusieurs blocs si on a envie...

 

 (defun c:Replace_Bloc (/ bloc_sel Group_bloc_sel Quest index bloc_R)
 (princ "\n------------------------------\n Sélection du Bloc à Remplacer:")
  (while (= bloc_sel nil)
   (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT")))))  
  [b] (sssetfirst nil bloc_sel) [/b]
 
 (initget "Oui Non")
 (setq Quest (getkword "\n Choix Multiple (Oui/Non)?  "))
 (if (= Quest "Oui")(progn
   (setq Group_bloc_sel (ssget (list '(0 . "INSERT")(assoc 2 (entget (ssname bloc_sel 0))))))
 (ssadd (ssname bloc_sel 0) Group_bloc_sel)
   (setq bloc_sel Group_bloc_sel)))

(setq bloc_R (getstring "\n Entrez le nom du bloc Remplaçant ou : "))
(if (= bloc_R "")
(progn
(while (= bloc_R "")
(setq bloc_R (ssget "_:S:E" '((0 . "INSERT"))))
)
(setq bloc_R (cdr (assoc 2 (entget (ssname bloc_R 0)))))
)
)  
 (setq index 0)
 (repeat (sslength bloc_sel)    
;; Changement du nom d'entité en vla-object
(setq obj (vlax-ename->vla-object (ssname bloc_sel index)))
 
(vla-put-layer
(vla-insertblock
(vla-get-modelspace
(vla-get-activedocument (vlax-get-acad-object))
)
(vla-get-InsertionPoint obj)
(findfile (strcat bloc_R ".dwg" ))
(vla-get-XScaleFactor obj)
(vla-get-YScaleFactor obj)
(vla-get-ZScaleFactor obj)
(vla-get-rotation obj)
)
(vla-get-layer obj)
)
(vla-delete obj)
   (setq index (1+ index)))
)

 

... par contre, la dernière chose qui me déplait est que le (sssetfirst nil bloc_sel) ne fonctionne pas, et que donc il n'y a pas confirmation visuel comme quoi on a bien choisit le bon bloc...

si vous connaissez la solution...

merci pour tout ...

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut,

 

Pour mettre un objet en surbrillance, tu peux utiliser (vla-Highlight ...)

 

Remplace (sssetfirst nil bloc_sel) par :

 

(setq obj (vlax-ename->vla-object (ssname bloc_sel 0)))

(vla-Highlight obj 1)

 

pour enlever la surbrillance :

 

(vla-Highlight obj 0)

 

De plus en traduisant le bloc sélectionné en vla-object dès le début du LISP, tu peux utliser (cons 2 (vla-get-name obj)) à la place de :

(assoc 2 (entget (ssname bloc_sel 0)))

 

Sinon, dans l'état ton LISP ne fonctionne qu'avec des wblocs, peut-être devrait tu essayer d'utiliser la proposition faite ici.

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

Posté(e)

merci (gile)... (1650ème fois...)

 

[surligneur] -[/surligneur] (vla-Highlight ...) fonctionne trés bien.

 

De plus en traduisant le bloc sélectionné en vla-object dès le début du LISP, tu peux utliser (cons 2 (vla-get-name obj)) à la place de :

(assoc 2 (entget (ssname bloc_sel 0)))

 

[surligneur] -[/surligneur] dans mon lisp, je regroupe la selection si l'utilisateur fait le choix de modifier plusieurs blocs (identiques)

 (initget "Oui Non")
 (setq Quest (getkword "\n Choix Multiple (Oui/Non)?  "))
 (if (= Quest "Oui")(progn
   (setq Group_bloc_sel (ssget (list '(0 . "INSERT")(assoc 2 (entget (ssname bloc_sel 0))))))
  [b] (ssadd (ssname bloc_sel 0) Group_bloc_sel)[/b]
   (setq bloc_sel Group_bloc_sel)))

... donc je traite apères un groupe de selection avec ma boucle...

  (setq index 0)
 (repeat (sslength bloc_sel)    
;; Changement du nom d'entité en vla-object
(setq obj (vlax-ename->vla-object (ssname bloc_sel index)))
 
(vla-put-layer
(vla-insertblock
(vla-get-modelspace
(vla-get-activedocument (vlax-get-acad-object))
)
(vla-get-InsertionPoint obj)
(findfile (strcat bloc_R ".dwg" ))
(vla-get-XScaleFactor obj)
(vla-get-YScaleFactor obj)
(vla-get-ZScaleFactor obj)
(vla-get-rotation obj)
)
(vla-get-layer obj)
)
(vla-delete obj)
   (setq index (1+ index)))
)

je ne sais pas comment faire pour traduire ça en -vl....

 

[surligneur] -[/surligneur]

Sinon, dans l'état ton LISP ne fonctionne qu'avec des wblocs, peut-être devrait tu essayer d'utiliser la proposition faite ici.

... heu... c'est un post que j'ai fait en parrallèle afin de savoir si l'on peut enlever le texte de mise à jour de bloc dans la ligne de commande du fait de l'utilisation de vla-insertblock... les exemples cité sont des copiers-coller du post ici présent ...

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Pour les jeux de sélection, je fais comme toi en AutoLISP et traduction des entités en vla-object dans la boucle qui traite le jeux de sélection, si tu veux le faire en "vlisp pur" c'est beaucoup plus ingrat (voir "lourdingue").

 

Il faut ajouter un nouvel objet "jeu de sélection" à l'objet "collection des jeux de sélections" de l'objet "document actif" de l'objet "acad application" :

 

(setq Group_Bloc_Sel

(vla-add

(vla-get-SelectionSets

(vla-get-ActiveDocument (vlax-get-acad-object))

)

"Group_Bloc_Sel"

)

)

 

Et ensuite utiliser (vla-SelectOnScreen Group_Bloc_Sel) pour une sélection à l'écran, et/ou (vla-addItems ...) pour y ajouter des objets (sous forme de variant).

 

Je dois dire que je n'ai toujours pas bien compris comment faire un filtre de sélection avec vla-SelectOnScreen et je trouve que transformer des listes d'objets en variants est fastidieux.

 

 

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

Posté(e)

Salut

Un exemple que j'avais trouvé je ne sais plus où

 

@+

 

(defun selectionvl ( / ssets acadDocument newsset ctr item)
;load the visual lisp extensions
(vl-load-com)
;retrieve a reference to the documents object
;(setq acadDocument (vla-get-activedocument
; 			   (vlax-get-acad-object)))
;retrieve a reference to the selection sets object
(setq ssets (vla-get-selectionsets acadDocument))
;add a new selection set
(setq newsset (vla-add ssets "SS1"))
;select your new selection set objects
(vla-selectOnScreen newsset)
;set the counter to zero
(setq ctr 0)
;count the number of objects and loop
(repeat (vla-get-count newsset)
  	;retrieve each object
  	(setq item (vla-item newsset ctr))
  	;check if the entity has a color property
  	;and it can be updated
 	(setq check (vlax-property-available-p item "Color" T))
  	;if it can
  	(if check
  		;change it's color
  		(vlax-put-property item 'Color 5)
  	);if
      (setq ctr (1+ ctr))
);repeat

;Selecting with Filters
;Now things get a wee bit tricky. I suggest you read my Tutorial on "Arrays" before you carry on with this section, as a good understanding of them will help you a lot.
;First of all, let's have a look at the VBA syntax for Selecting with Filters :
;object.SelectOnScreen [FilterType][, FilterData]
;Object : SelectionSet
;The object or objects this method applies to.
;FilterType : Integer; input-only; optional
;A DXF group code specifying the type of filter to use.
;FilterData : Variant; input-only; optional
;The value to filter on.
;ActiveX requires a Filter Type to be an Array of Integers, and the Filter Data to be an Array of Variants. To Filter for all Objects on Layer "7" we would write it like this in Visual Lisp:
;
;create a single element array for the DXF Code
(setq filter_code (vlax-make-safearray vlax-vbinteger '(0 . 0)))
;create a single element array for the value
(setq filter_value (vlax-make-safearray vlax-vbvariant '(0 . 0)))
;DXF Code for layers
(vlax-safearray-fill filter_code '(8))
;the filter value
(vlax-safearray-fill filter_value '("7"))
;Use Select on Screen to select objects on Layer 7
(vla-selectOnScreen newsset filter_code filter_value)

;In AutoLisp you would write this :
(setq newsset (ssget '((8 . "7"))))



;To select ALL the Circles on Layer "2", We would write this :
;create a 2 element array for the DXF Code
(setq filter_code (vlax-make-safearray vlax-vbinteger '(0 . 1)))
;create a 2 element array for the values
(setq filter_value (vlax-make-safearray vlax-vbvariant '(0 . 1)))
;DXF Code for Objects and Layer
(vlax-safearray-fill filter_code '(0 8))
;the filter values
(vlax-safearray-fill filter_value '("CIRCLE" "2"))
;select ALL Circles on Layer 2
(vla-select newsset acSelectionSetAll nil nil filter_code filter_value)
;This is the equivalent in AutoLisp :
(setq newsset (ssget "x" '((0 . "CIRCLE") (8 . "2"))))


;To select ALL Circles OR Text, we would write this :
;create a 4 element array for the DXF codes
(setq filter_code (vlax-make-safearray vlax-vbinteger '(0 . 3)))
;create a 4 element array for the names
(setq filter_value (vlax-make-safearray vlax-vbvariant '(0 . 3)))
;DXF Codes for OR and Objects
(vlax-safearray-fill filter_code '(-4 0 0 -4))
;the filter values
(vlax-safearray-fill filter_value '(""))
;select ALL Circles OR Text
(vla-select newsset acSelectionSetAll nil nil filter_code filter_value)
;In AutoLisp, this is equivalent to :
(setq newsset  (ssget "x" '((-4 . ""))))



 (setq thisDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
 (if sampset
   (vla-clear sampset)			; start from scratch
   (progn
     (setq selsets (vla-get-SelectionSets thisDoc))
; each document sustains a selection set with variable sampset
     (setq sampset (vla-add selsets "mdi-vlx"))
   )
 )
 (vla-SelectOnScreen sampset)
  	;increment the counter
  	(setq ctr (1+ ctr))
);repeat
 ;delete the selection set
 (vla-delete (vla-item ssets "SS1"))
 (princ)
);defun
(princ)

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Merci Patrick_35, j'ai appris comment faire un filtre en "pur VisualLISP" et ça ne fait que me conforter dans ce que je disais : AutoLISP est beacoup plus souple pour ce genre de choses !

 

Pour traduire le LISP de Bred en "pur VisualLISP" :

 

Pour la sélection du premier bloc, comme je n'ai pas trouvé l'équivalent de (ssget "_:S:E" ...) pour ne sélectionner qu'un objet, on peut passer par l'équivalent de (entsel ...) en remplaçant le filtre par un test en boucle.

 

Remplacer :

(princ "\n------------------------------\n Sélection du Bloc à Remplacer:")
(while (= bloc_sel nil)
(setq bloc_sel (ssget "_:S:E" '((0 . "INSERT"))))) 

Par :

(while (not
 (and Bloc_sel
      (= (vla-get-ObjectName Bloc_sel) "AcDbBlockReference")
 )
      )
 (vl-catch-all-apply ;_ nécessaire si sélection nulle
   'vla-getEntity
   (list (vla-get-Utility ;_ Pointeur vers l'objet "Utility"
    (vla-get-ActiveDocument (vlax-get-acad-object))
  )
  'Bloc_sel ;_ vla-object
  'p_pt ;_ pick-point
  "\nSélectionnez le bloc à remplacer"
   )
 )
) 

 

Pour remplacer:

(if (= Quest "Oui")(progn
(setq Group_bloc_sel (ssget (list '(0 . "INSERT")(assoc 2 (entget (ssname bloc_sel 0))))))
(ssadd (ssname bloc_sel 0) Group_bloc_sel)
(setq bloc_sel Group_bloc_sel)))

 

On crée le jeu de sélection (vide) :

(setq Group_Bloc_Sel
      (vla-add
 (vla-get-SelectionSets
   (vla-get-ActiveDocument (vlax-get-acad-object))
 )
 "Group_Bloc_Sel"
      )
) 

 

On le remplit si Choix Multiple = Oui :

(if (= Quest "Oui")
 ;; Sélection à l'écran
 (vla-SelectOnScreen
   Group_Bloc_Sel
   (vlax-SafeArray-fill
     (vlax-make-SafeArray
vlax-vbInteger
'(0 . 1)
     )
     '(0 2)
   )
   (vlax-SafeArray-fill
     (vlax-make-SafeArray
vlax-vbVariant
'(0 . 1)
     )
     (list "INSERT" (vla-get-Name Bloc_sel))
   )
 )
) 

 

On y ajoute bloc_sel :

(vla-addItems
 Group_Bloc_Sel
 (vlax-SafeArray-fill
   (vlax-make-SafeArray
     vlax-vbObject
     '(0 . 0)
   )
   (list Bloc_sel)
 )
) 

 

Et on peut traiter le jeu de sélection avec un (Vlax-for ...)

(vlax-for obj Group_Bloc_Sel
 (vla-put-layer
   (vla-insertblock
     (vla-get-modelspace
(vla-get-activedocument (vlax-get-acad-object))
     )
     (vla-get-InsertionPoint obj)
     (findfile (strcat bloc_R ".dwg"))
     (vla-get-XScaleFactor obj)
     (vla-get-YScaleFactor obj)
     (vla-get-ZScaleFactor obj)
     (vla-get-rotation obj)
   )
   (vla-get-layer obj)
 )
 (vla-delete obj)
 ) 

 

Il faut supprimer l'objet "jeu de sélection" de la collection des jeux de sélection pour pouvoir le recréer lors d'un autre appel du LISP (les entité contenues dans le jeu ne sont pas supprimées) :

(vla-delete Group_Bloc_Sel) 

 

On doit pouvoir éviter de faire certains variants en utilisant (vlax-invoke ...) à la place de certains (vla-...) voir ce sujet.

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

Posté(e)

merci (gile)

... j'avoue qu'il me faut prendre le temps de comprendre tout ça... c'est recopié, et prêt à être décortiqué !!! ...

 

Juste pour info, j'en étais resté à (vla-Highlight ...) qui fonctionne trés bien.

Le seul souci étant que si je fait un Echap avant le (vla-Highlight obj 0), l'objet reste en surbrillance... et impossible de l'enlever...

Donc : j'ai rentrer dans ma gestion d'erreur une petite routine équivalente à ton "SAVE&SET_VAR" :

 ;;; ROUTINE COMMANDE DE REINITIALISTION si ERROR
(defun LANCE_si_ERROR (cd)
    (setq list_lance_si_error
    (append (list cd) list_lance_si_error))

 

et pour revenir à l'état initial, mis dans la rédéfinition de *error* :

 

 (mapcar 'eval list_lance_si_error)

 

... ce qui fait que j'ai dans le début du code :

 

 (INTRO_PRG_ERR)
 (princ "\n------------------------------\n Sélection du Bloc à Remplacer:")
  (while (= bloc_sel nil)
    (setq bloc_sel (ssget "_:S:E" '((0 . "INSERT")))))
 (setq obj (vlax-ename->vla-object (ssname bloc_sel 0))) ;
 (vla-Highlight obj 1) ;;;surbrillance
  [b] (LANCE_si_ERROR '(vla-Highlight obj 0)) [/b]..... etc

 

et ça fonctionne trés bien !!! (cette routine LANCE_si_ERROR me permettra de rentrer ce type de commande qui ne peuvent pas être re-initialiser autrement que par la commande elle-même...)

 

merci

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Bravo pour la gestion des erreurs !

 

Pour ce qu'il en est des créations de jeux de sélections en VisualLISP, je donnais ça à titre anecdotique et pour essayer de comprendre de mon côté comment fonctionnaient les filtres de sélections.

 

Si tu fais une recherche dans les forums avec vla-get-selectionsets il n'y a que 10 messages dont 3 pour ce sujet !

 

La plupart des vlispeurs (sur CADxp en tous cas) utilisent (ssget ...) et traduisent ensuite les entités en vla-object, c'est beaucoup moins lourd !

 

 

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

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é