Aller au contenu

[Résolu] Hachures avec îlot en VLA


Fraid

Messages recommandés

Bonjours,

 

Je galère avec la méthode AppendOuterLoop.

 

J'arrive très bien à hachurer des polylignes une par une comme cela.

(defun hachit ( Motif sel / hach n vsel)
(setq n -1)
(repeat (sslength sel)
   (setq vsel (vlax-ename->vla-object (ssname sel (setq n (+ 1 n))))
hach (vla-addhatch 
     (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) 
     acHatchPatternTypePredefined 
     Motif 
     :vlax-false 
     acHatchObject
)
)
   (vlax-invoke hach 'AppendOuterLoop (list vsel))
   (vla-evaluate hach)
)
)

 

voyant que AppendOuterLoop demande une liste

j'ai essayé ceci.

 

(defun hachsel ( Motif sel / hach  vsel)
   (setq vsel (selectionset->vla-objects sel)
hach (vla-addhatch 
     (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) 
	acHatchPatternTypePredefined 
	Motif 
	:vlax-false 
	acHatchObject
     )
)
(vlax-invoke hach 'AppendOuterLoop  vsel)
(vla-evaluate hach)
)
(defun selectionset->vla-objects (ss / c ename)
(setq c -1)
(repeat (sslength ss)
(setq ename (cons (ssname ss (setq c (+ 1 c))) ename))
)
(mapcar 'vlax-ename->vla-object (reverse ename))
)

plante au niveau du (vlax-invoke hach 'AppendOuterLoop vsel)

comprend pas, et ne trouve pas d'exemple qui permettrais de prendre en compte les îlots.

 

Merci

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Pourquoi utiliser ssname alors que tu as directement activeselectionset

 

Par exemple

(ssget "_x")
(setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
(vla-get-count sel)
(vla-item sel 0)
(vlax-for obj sel
 (terpri)
 (princ (vla-get-objectname obj))
)
(vla-delete sel)

 

Et je pense que cela va résoudre ton problème de vsel (vlax-invoke ... (list vsel))

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Merci Patrick pour tes précieux conseils.

 

j'ai donc essayé ceci

 

(defun hachsel ( Motif / doc hach vsel)
   (ssget "_X" (list (cons 0 "LWPOLYLINE")(cons 70 1)))
   (setq 	doc  (vla-get-activedocument (vlax-get-acad-object))
        vsel (vla-get-activeselectionset doc)
	hach (vla-addhatch 
             (vla-get-modelspace doc) 
		acHatchPatternTypePredefined 
		Motif 
		:vlax-false 
		acHatchObject
	)
    )
(vlax-invoke hach 'AppendOuterLoop  (list vsel))
(vla-evaluate hach)
)

 

et la j'ai cette erreur AutoCAD.Application: Echec de QueryInterface IID_IAcadBaseObject ????

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Il faut faire attention sur cette liste.

Elle ne doit contenir que les objets permettant de définir 1 SEUL contour.

Par ex, si tu dessines 4 lignes qui forment un rectangle, tu dois passer les 4 lignes sous forme de liste à ton AppendOuterLoop.

Par contre si tu as dessiné une polyligne fermée qui forme un rectangle tu dois passer une liste à un seul élément (ta polyligne) à AppendOuterLoop.

Si tu veux créer une hachure "composée" de plusieurs polylignes fermée, il me semble que tu dois appeler autant de AppendOuterLoop que tu as de poly fermée dans ton objet Hachure..

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Comme l'indique Olivier Eckmann, c'est avec AppendInnerLoop

 

Et en prime, un exemple pour faire une hachure sur plusieurs poly fermées.

(defun c:test(/ doc ent hac lst obj sel)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (and (ssget)
   (progn
     (vlax-for ent (setq sel (vla-get-activeselectionset doc))
(setq lst (cons ent lst))
     )
     (vla-delete sel)
     (setq hac (vla-addhatch (vla-get-modelspace doc) acHatchPatternTypePredefined "SOLID" :vlax-false))
     (vlax-invoke hac 'appendouterloop lst)
     (and (ssget)
(progn
  (setq lst nil)
  (vlax-for ent (setq sel (vla-get-activeselectionset doc))
    (setq lst (cons ent lst))
  )
  (vla-delete sel)
  (setq obj (vlax-make-safearray vlax-vbObject (cons 0 (1- (length lst)))))
  (vlax-safearray-fill obj lst)
  (vla-insertloopat hac (vla-get-numberofloops hac) acHatchLoopTypeDefault obj)
)
     )
     (vlax-invoke hac 'evaluate)
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

1) Tu sélectionnes une 1ere poly (ou un ensemble d'objets lignes, arcs, etc.…)

2) Une première hachure se créé.

3) Tu sélectionnes une 2em poly (ou un ensemble d'objets lignes, arcs, etc.…)

4) La hachure s'étend maintenant au nouvel objet.

5) Je te laisse faire pour AppendInnerLoop.

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

J'y suis arrivé avec mes ssname

l'argument sel étant le jeux de sélection des grandes polylignes.

et j’utilise la fonction vertices de Gile pour capturer éventuellement des polylignes closes

à l’intérieur des grandes.

(defun hachsel ( Motif sel / n nn doc hach vsel polin vpolin)
(setq doc (vla-get-activedocument (vlax-get-acad-object))
      n -1
)
(repeat (sslength sel)
   (setq 	esel (ssname sel (setq n (+ 1 n)))
		vsel (vlax-ename->vla-object esel)
		hach (vla-addhatch 
                     (vla-get-modelspace doc) 
			acHatchPatternTypePredefined 
			Motif 
			:vlax-false 
			acHatchObject
			)
		nn -1
)
   (vlax-invoke hach 'AppendOuterLoop (list vsel))
(if (setq polin (ssget "_wp" (vertices esel)(list (cons 0 "LWPOLYLINE")(cons 70 1))))
	(repeat (sslength polin)
	 (setq vpolin (vlax-ename->vla-object (ssname polin (setq nn (+ 1 nn)))))
	 (vlax-invoke hach 'AppendInnerLoop (list vpolin))
	 (vla-evaluate hach)
	)
(vla-evaluate hach)
)

)
(vla-regen doc :vlax-true)
)

(defun vertices (ent / i lst);GC
 (setq i (1+ (fix (vlax-curve-getEndParam ent))))
 (repeat i
   (setq lst (cons (vlax-curve-getPointAtParam ent (setq i (1- i))) lst))
 )
 lst
)

 

ce soir je vais plancher sur l'active document :blink:

merci encore

Lien vers le commentaire
Partager sur d’autres sites

Je suis content que tu y sois arrivé :D

 

Comme c'était aussi un exercice pour moi, voici une version de démo.

(defun c:demo(/ doc ent hac select)
 (defun select(/ ent lst sel)
   (vlax-for ent (setq sel (vla-get-activeselectionset doc))
     (setq lst (cons ent lst))
   )
   (vla-delete sel)
   lst
 )

 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (princ "\nSélectionnez une 1ere poly fermé pour hachure.")
 (and (ssget)
   (progn
     (setq hac (vla-addhatch (vla-get-modelspace doc) acHatchPatternTypePredefined "SOLID" :vlax-true))
     (vlax-invoke hac 'appendouterloop (select))
     (princ "\nSélectionnez une 2em poly fermé pour ilot.")
     (and (ssget)
(vlax-invoke hac 'appendinnerloop (select))
     )
     (princ "\nSélectionnez une 3em poly fermé pour étendre la hachure.")
     (and (ssget)
(vlax-invoke hac 'insertloopat (vla-get-numberofloops hac) acHatchLoopTypeDefault (select))
     )
     (vlax-invoke hac 'evaluate)
   )
 )
 (vla-endundomark doc)
 (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

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é