Aller au contenu

Simplifier une lwpolyligne


Messages recommandés

Posté(e)

Bonjour a tous,

 

Comment en Vlisp/AutoLISP, réduire à deux sommets (point 1 et point 2) un ensemble de lwpolylignes qui possèdent plusieurs sommets.

 

Merci d'avance,

 

Bonne journée

 

Fabrice

 

Posté(e)

Hello

 

Pour Info je suis interesse par une legere variante de ce "futur" programme qui traite les N polylignes selectionnees :

 

1) Poser une question avant de traiter ...

 

- soit reduire aux sommets 1 et 2

- soit reduire au 1er sommet et DERNIER sommet

 

Ensuite, si le programme pouvait traiter TOUT type de polyligne, ca serait super : lwpline, pline, 3Dpoly, etc

 

Merci d'avance, Le Decapode (suiveur de Fabcad)

 

 

Autodesk Expert Elite Team

Posté(e)

 

Hello Gilles et Fabcad

 

Personnellement, je me moque completement des arcs

ou que la polyligne soit lissee ou splinee !

Qu'elle soit 2D ou 3D !

 

Qu'en pense notre ami Fabcad ?

 

Le Decapode

 

Autodesk Expert Elite Team

Posté(e)

Bon, un premier jet.

 

Vu la technique utilisée (vlax-put pl 'Coordinates) il est possible que ça ne fonctionne pas avec les versions antérieures à 2007.

Si le premier segment est un arc (lwpolyline ou polyligne 2d simple), le segment résultant récupère le bulge.

Si la polyligne est lissée ou splinée, avec l'option Second, le second sommet est celui de la polyligne avant lissage ou splinage.

 

(defun c:PL2SEG	(/ *error* opt ss old new rev)
 (vl-load-com)

 (defun *error* (msg)
   (and msg
 (/= msg "Fonction annulée")
 (princ (strcat "\nErreur: " msg))
   )
   (vla-EndUndoMark acdoc)
   (princ)
 )

 (setq acdoc (vla-get-Activedocument (vlax-get-acad-object)))
 (initget "Dernier Second")
 (setq	opt
 (cond
   ((getkword "\nChoisir une option [Dernier/Second] : "))
   ("Dernier")
 )
 )
 (if (ssget '((0 . "*POLYLINE")
       (-4 . "	       (-4 . "&")
       (70 . 112)
       (-4 . "not>")
      )
     )
   (progn
     (vla-StartUndoMark acdoc)
     (vlax-for	pl (setq ss (vla-get-ActiveSelectionSet acdoc))
(setq old (vlax-get pl 'Coordinates))
(if (= (vla-get-ObjectName pl) "AcDbPolyline")
  (if (= opt "Dernier")
    (setq rev (reverse old)
	  new (list (car old) (cadr old) (cadr rev) (car rev))
    )
    (setq
      new (list (car old) (cadr old) (caddr old) (cadddr old))
    )
  )
  (if (= opt "Dernier")
    (setq rev (reverse old)
	  new (list (car old)
		    (cadr old)
		    (caddr old)
		    (caddr rev)
		    (cadr rev)
		    (car rev)
	      )
    )
    (setq new (list (car old)
		    (cadr old)
		    (caddr old)
		    (cadddr old)
		    (nth 4 old)
		    (nth 5 old)
	      )
    )
  )
)
(vlax-put pl 'Coordinates new)
     )
     (vla-delete ss)
     (vla-EndUndoMark acdoc)
   )
 )
 (princ)
)

 

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

Posté(e)

 

Hello Gilles

 

En effet avec une version 2006, on a une belle erreur :

Choix des objets:

; erreur: une exception s'est produite: 0xC0000005 (Violation d'accès)

; avertissement: fonction unwind ignorée erreur inconnue

 

Avec une version 2008 (ou 2007 ou plus), ca marche parfaitement ! :)

 

J'ai teste avec des polylignes 2D fermees ou non, splinees, lissees

et aussi avec des 3DPoly ... :P

 

Comme d'hab. ton programme est nickel-chrome !

et en plus les polylignes conservent leurs XDATAs et OD (Object Data) de MAP (ou CIVIL)

 

Normal car en fait si j'ai bien compris, tu modifes l'objet d'origine !! ;)

 

Merci, Le Decapode

 

 

 

Autodesk Expert Elite Team

Posté(e)

Hello Gilles

 

 

 

Nous sommes sur la même longueur d'ondes mon cher décapode :-)

Les arcs sur les lwpolylignes c'est la précision que les logiciels SIG bureautiques ne savent pas faire !

 

Avec une version 2009, ca fonctionne très bien,

 

Une explication sur

(70 . 112) 

serait la bienvenue, je n'ai pas trouvé cette valeur dans l'aide des codes DXF.

 

C'est le genre d'outils qui dans la production de données d'un SIG diminue le temps de traitement et en plus le fait de conserver l'objet d'origine assure la pérennité des données attributaires.

 

Une personne comme toi chez GéoMAP et le SIG Autodesk se développera de façon exponentielle.

 

Merci,

 

Fabrice le Gallo-breton,

 

 

[Edité le 19/2/2010 par fabcad]

Posté(e)
Une explication sur
(70 . 112) 

serait la bienvenue, je n'ai pas trouvé cette valeur dans l'aide des codes DXF.

 

Le code de groupe 70 des entités POLYLINE renseigne sur le type de polyligne.

Sa valeur est une somme de codes binaires, par exemple :

1 indique une polyligne 2d simple fermée

4 indique une polyligne 2d splinée

131 (1 + 2 + 128) indique une polyligne lissée fermée avec la génération du type de ligne actif.

9 (1 + 8) indique une polyligne 3d (8) fermée (1)

 

Il s'agit, avec ce filtre de ne retenir que les polylignes 2d ou 3d quel que soit leur type, autrement dit, d'écarter toute polyligne de type maillage.

 

112 est la somme des codes binaires qui caractérisent les polylignes de type maille (elles peuvent aussi avoir 1 si elles sont fermées dans la direction M) :

16 = Surface maillée 3D.

32 = Surface maillée fermée dans la direction N.

64 = La polyligne est une maille polyface.

 

Dans le filtre de sélection, l'utilisation de cette somme de codes est liée aux expressions qui l'encadrent :

(-4 . "")

le (-4 . "&") est un "AND" logique qui retourne "vrai" si un code binaire du groupe 70 de la polyligne est contenu dans 112.

(-4 . "&") (70 . 112) est à peu près équivalent à :

(/= 0 (logand 112 (cdr (assoc 70 ListeDxfDeLaPolyligne)))

 

Ce qui, encadré par (-4 . "") inverse le résultat soit :

(= 0 (logand 112 (cdr (assoc 70 ListeDxfDeLaPolyligne)))

 

Autrement dit en français : le groupe DXF 70 de la polyligne ne doit contenir ni 16, ni 32, ni 64.

 

 

Une personne comme toi chez GéoMAP et le SIG Autodesk se développera de façon exponentielle.

S'ils sont susceptibles de m'embaucher, je suis ouvert à toute proposition...

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é