Aller au contenu

Ajouter un sommet sur une polyligne


yalta

Messages recommandés

J'ai répondu à une demande similaire ailleurs (mais il voulait une routine), alors je la poste ici aussi.

 

Edit : Nouvelle version, si un sommet est ajouté sur un segment en arc, les deux segments générés sont tangents.

 

;;; SUBLST Retourne une sous-liste
;;; Premier élément : 1
;;; (sublst '(1 2 3 4 5 6) 3 2) -> (3 4)
;;; (sublst '(1 2 3 4 5 6) 3 nil) -> (3 4 5 6)

(defun sublst (lst start leng / rslt)
 (if (not (    (setq leng (- (length lst) (1- start)))
 )
 (repeat leng
   (setq rslt	(cons (nth (1- start) lst) rslt)
  start	(1+ start)
   )
 )
 (reverse rslt)
)

;; SPLIT-LIST Retourne une liste de sous-listes
;; Arguments
;; - lst : la lste à fractionner
;; - num : un entier, le nombre d'éléments des sous listes
;; Exemples :
;; (split-list '(1 2 3 4 5 6 7 8) 2) -> ((1 2) (3 4) (5 6) (7 8))
;; (split-list '(1 2 3 4 5 6 7 8) 3) -> ((1 2 3) (4 5 6) (7 8))

(defun split-list (lst n)
 (if lst
   (cons (sublst lst 1 n)
  (split-list (sublst lst (1+ n) nil) n)
   )
 )
)

;;; Angle2Bulge
;;; Retourne le bulge correspondant à un angle
(defun Angle2Bulge (a)
 (/ (sin (/ a 4.0)) (cos (/ a 4.0)))
)

;;; Ang
(defun ang  (if (and (    ang
   (ang  )
)

;;; Clockwisep Retourne T si les points p1 p2 et p3 tournent dans le sens horaire

(defun Clockwisep (p1 p2 p3)
 ()

;;; ArcCenterBy3Points
;;; Retourne le centre de l'arc décrit par 3 points
(defun ArcCenterBy3Points (p1 p2 p3)
 ((lambda (mid1 mid2)
    (inters mid1
     (polar mid1 (+ (angle p1 p2) (/ pi 2)) 1.0)
     mid2
     (polar mid2 (+ (angle p2 p3) (/ pi 2)) 1.0)
     nil
    )
  )
   (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) p1 p2)
   (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) p2 p3)
 )
)

;;; AddVertex
;;; Ajout des sommets à une polyligne

(defun c:addvertex (/ pl ob pt pa co no p1 p2 pt ce a1 a2 bu)
 (while (and
   (setq pl (entsel "\nSélectionnez le segment auquel rajouter un sommet: "))
   (setq ob (vlax-ename->vla-object (car pl)))
   (= (vla-get-objectName ob) "AcDbPolyline")
   (setq pa (fix
	      (vlax-curve-getParamAtPoint
		ob
		(trans (osnap (cadr pl) "_nea") 1 0)
	      )
	    )
   )
 )
   (if	(setq
  pt (getpoint (trans (vlax-curve-getPointAtParam ob pa) 0 1)
	       "\nSpécifiez le sommet à ajouter: "
     )
)
     (progn
(vla-StartUndoMark
  (vla-get-ActiveDocument (vlax-get-acad-object))
)
(setq co (split-list (vlax-get ob 'Coordinates) 2)
      no (vlax-get ob 'Normal)
      p1 (trans (vlax-curve-getPointAtParam ob pa) 0 no)
      p2 (trans (vlax-curve-getPointAtParam ob (1+ pa)) 0 no)
      pt (trans pt 1 no)
      ce (ArcCenterBy3Points p1 pt p2)
)
(if (= 0 (vla-getBulge ob pa))
  (setq	a1 0.0
	a2 0.0
  )
  (if (clockwisep p1 pt p2)
    (setq a1 (- (ang		  a2 (- (ang	    )
    (setq a1 (ang		  a2 (ang	    )
  )
)
(setq bu
       (list (cons pa (Angle2Bulge a1))
	     (cons (1+ (fix pa))
		   (Angle2Bulge a2)
	     )
       )
)
(setq pa (1+ pa))
(setq co (append (sublst co 1 pa)
		 (cons (list (car pt) (cadr pt))
		       (sublst co (1+ pa) nil)
		 )
	 )
)
(while (	  (setq bu (cons (cons pa (vla-getBulge ob (1- pa))) bu))
)
(vlax-put ob 'Coordinates (apply 'append co))
(mapcar '(lambda (x) (vla-setBulge ob (car x) (cdr x))) bu)
(vla-EndUndoMark
  (vla-get-ActiveDocument (vlax-get-acad-object))
)
     )
   )
 )
 (princ)
) 

[Edité le 10/4/2007 par (gile)]

 

[Edité le 10/4/2007 par (gile)]

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Modification du comportement du LISP ci-dessus quand le sommet est ajouté sur un segment en arc de cercle.

 

En haut avec PEDIT, en bas avec ADDVERTEX

 

http://xs514.xs.to/xs514/07152/pedit2.png

 

[Edité le 10/4/2007 par (gile)]

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

le même pour "suppression d'un sommet" mais qui marche , c'est possible ?

 

Voilà, ça semble fonctionner, AddVtx pour ajouter des sommets aux polylignes optimisées ainsi qu'aux polylignes 2D et 3D non lissées ou splinées. DelVtx pour supprimer des sommets.

 

AddVtx&DelVtx, en téléchargement ou encore, sur cette page

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

 

Hello

 

Comme d'habitude, c parfait !

 

ADDVERTEX.LSP testée et validée sur MAP 2004 et MAP 2007 :)

 

Par contre il y a un problème de VLA-LOAD sur MAP R6 (ACAD 2002 en fait)

 

Le Decapode (Utilisateur et Testeur Intensif)

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut lecrabe,

 

Encore une fois merci pour les tests et surtout les retours :D

 

La version que tu as testée, est-ce celle données plus haut (à laquelle il manque effectivement un (vl-load-com)) ou celle en téléchargement (plus complète : gestion des erreur, fonctionnement avec polylignes 3d, 2d et lw) ?

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

La version de ADDVERTEX testée était celle mentionnée dans CE fil de discussion !

 

Pourquoi les 2 routines dans TA liste de Lisp sont plus complètes : gestion des erreurs, VLA-LOAD, Polyligne 2D/3D, etc ???

 

Le Decapode

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

citation extraite du message original:

le même pour "suppression d'un sommet" mais qui marche , c'est possible ?

 

 

 

Voilà, ça semble fonctionner, AddVtx pour ajouter des sommets aux polylignes optimisées ainsi qu'aux polylignes 2D et 3D non lissées ou splinées. DelVtx pour supprimer des sommets.

 

AddVtx&DelVtx, en téléchargement ou encore, sur cette page

 

J'lavais pas vu passer cette réponse :o

 

Merci (gile)

 

PS : Dans la série "On en apprend tous les jours"

Plusieurs Lisp dans le même fichier

Lien vers le commentaire
Partager sur d’autres sites

  • 3 ans après...

bonjour à tous,

c'est la première fois que je vous contacte ce site est tellement bien fais que je commence a m'intéresser.

Mais malheureusement j'ai essayé d'utiliser une lips de giles avec ses explications mais le logiciel

ZWCAD me répond

à la commande (ajouter points polyligne

réponse: Missing: 1) >

 

que dois faire?

me suis tromper quelque part?

 

Merci pour votre compréhension "je débute" malgré mon âge 52 balais, mais il n'est jamais trop tard non? :D

Lien vers le commentaire
Partager sur d’autres sites

RE :( :D :D :D :D :D

 

J'ai oublieé connaissez-vous un ouvrage sur le langage lips.

Y a t-il sur le forum un endroit pour les tous petits débutants?

Car je crois que je me suis mis la barre trop haute et j'aimerai progresser assez rapidement dans ce langage et ces possibilités

Merci encore :) :) :) :) :) :) :)

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour,

 

j'ai essayé d'utiliser une lips de giles avec ses explications mais le logiciel

ZWCAD me répond

à la commande (ajouter points polyligne

réponse: Missing: 1) >

 

Comme il y a des différences entre le Lisp d'AutoCAD et celui de ZwCAD, certaines routines nécessitent des modifications pour fonctionner avec ZwCAD.

 

Voici une version de AddVtx et DelVtx modifiée pour ZwCAD:

http://www.creao.fr/uploads/lisp/ZwAddVtx&DelVtx.LSP

 

Il reste des bugs sur les polylignes comportant des arcs ou des largeurs non uniformes. :(

 

 

 

[Edité le 27/3/2011 par bryce]

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour,

 

je voudrais d'abord remercier Gile pour ce lisp très pratique...

Je ne connais pas du tout ce langage de programmation c'est pourquoi je me permets de vous poser la question suivante :

 

J'ai environ 6000 petites polylignes 3D sur lesquelles j'aimerai ajouter des sommets (tout les 1m).

Est il possible de modifier le lisp pour pouvoir sélectionner d'un coup toute les polylignes à traiter et automatiser l'ajout de sommet tout les mètres?

Quelles seraient les commandes à ajouter?

 

Merci d'avance.

Cordialement.

Lien vers le commentaire
Partager sur d’autres sites

Hum je me dis que mon message n'est peut être pas si clair finalement...

 

J'aimerai apporter 2 modifications à ce lisp :

 

- la 1ére consiste à automatiquement ajouter un sommet tout les mètres à la polyligne sélectionné

 

- la 2nde consiste à pouvoir sélectionner plusieurs polylignes (ou un calque) pour traiter d'un coup toute les polylignes qu'il contient.

 

Mais comme je en connais pas le lisp je sais pas si c'est faisable...

 

Merci.

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

Si qq'un developpe la routine demandee par notre sympathique Fabcad,

je me permet de "refaire" le CDC/CCTP :

 

Sur une selection AutoCAD classique de Polylignes 2D "simples" (voire meme de Polylignes 2D "complexes" et aussi pourquoi pas de 3DPOLY) :

 

Question 1

Inserer un nouveau vertex tous les xx.xx unites (Valeur par defaut 1.00) : ?

et bien sur on compte a partir de chaque vertex de la polyligne ...

 

Resultat : qq jolis compteurs indiquant

- Nombre de polylignes traitables etaient dans la selection

- Nombre de polyligne modifiees

- Nombre de vertex inseres

- Nombre de polylignes NON modifiees

 

En fait ce programme realise une "densification" des polylignes !

 

Par exemple sur des troncons de canalisation existants, il faudrait un regard tous les 20 metres et malheureusement ce n'est pas le cas !

Bien sur il y a des regards / tampons a chaque vertex existant !

 

Merci d'avance, Le Decapode

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

@ gile : j'ai des polylignes 3D et je souhaite réaliser à partir de celles ci un MNT sous Mapinfo. Or Mapinfo ne crée un MNT qu'à partir de points.

 

L'idée est donc d'exporter les x,y,z des mes polylignes 3D (avec un certain 3DPOLY2FILE au passage merci...). Mais comme mes sommets ne sont pas très denses le résultat de mon MNT ne me satisfait pas.

 

Par contre si j'arrive à densifier mes polylignes 3D avec des sommets tout les mètres j'aurai à l'export énormément de points et donc un MNT très précis.

 

Voilà pour les raisons.

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Fabcad

 

Ah oui, elle est subtile celle-la !

Densifier des Polylignes 3D pour pouvoir ensuite exporter les vertex XYZ !!

et obtenir une sorte de nuage de points 3D ...

 

Mon exemple de Canalisation ou de troncon d'autre chose (Fibre par exemple ou Cana industrielle) s'est deja pose pour moi !

 

Le Decapode

 

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Hello Pat Le Décapode,

 

entre fabcad moi-même et fabbcad y a une homonymie :-)

 

Essayant les fonctions addvtx (ajouter) delvtx (supprimer) de Gile, il apparait que delvtx efface les données d'objets d' AutoCAD MAP.

 

Pour Information,

 

Fabrice le futur ex-dessinateur des pompiers.

 

A+

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é