Fraid Posté(e) le 8 janvier 2019 Posté(e) le 8 janvier 2019 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 listej'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 https://github.com/Fraiddd
Patrick_35 Posté(e) le 8 janvier 2019 Posté(e) le 8 janvier 2019 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Fraid Posté(e) le 9 janvier 2019 Auteur Posté(e) le 9 janvier 2019 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 ???? https://github.com/Fraiddd
Olivier Eckmann Posté(e) le 9 janvier 2019 Posté(e) le 9 janvier 2019 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
Fraid Posté(e) le 9 janvier 2019 Auteur Posté(e) le 9 janvier 2019 Merci Olivier, mais j'ai essayé en traitant les polylignes en boucle, et tout est hachuré, aucun îlot ne se forme. https://github.com/Fraiddd
Olivier Eckmann Posté(e) le 9 janvier 2019 Posté(e) le 9 janvier 2019 Salut, J'avais mal lu, pour faire des îlots, il faut un AppendOuterLoop de ton contour externe (sous forme de liste à 1 élément), puis AppendInnerLoop en passant la liste de tes îlots (zones de trous à ne pas hachurer). Olivier
Fraid Posté(e) le 9 janvier 2019 Auteur Posté(e) le 9 janvier 2019 YES Merci, je n'avais pas vu cette méthode, je vais donc tout de suite faire des recherches de se coté super https://github.com/Fraiddd
Patrick_35 Posté(e) le 9 janvier 2019 Posté(e) le 9 janvier 2019 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Fraid Posté(e) le 9 janvier 2019 Auteur Posté(e) le 9 janvier 2019 si je n'y arrive pas avec tous cela, je me remet à l'Autolisp :D Merci https://github.com/Fraiddd
Fraid Posté(e) le 9 janvier 2019 Auteur Posté(e) le 9 janvier 2019 J'y suis arrivé avec mes ssnamel'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 https://github.com/Fraiddd
Patrick_35 Posté(e) le 9 janvier 2019 Posté(e) le 9 janvier 2019 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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