Aller au contenu

création d\'intersection et reconstitution de contour


doy

Messages recommandés

 

Hello Gilles

 

Je confirme le bon fonctionnement de ton corridor.lsp (avec des polylignes) sur AutoCAD 2007

 

et son plantage sur AutoCAD 2006 ! :o

 

**** AutoCAD 2006 (et sans doute aussi sur 2005) ****

 

En fait si la polyligne est formée d'un seul segment : ca marche

 

Si la polyligne est formée de 2 segments ou plus : ca plante :(

 

Commande: corridor

 

Sélectionner une polyligne:

Longueur des boites : Spécifiez le deuxième point:

largeur des boites: Spécifiez le deuxième point: ; erreur: une exception s'est

produite: 0xC0000005 (Violation d'accès)

; avertissement: fonction unwind ignorée erreur inconnue

 

Une petite correction SVP !

 

Le Decapode "intéressé"

 

 

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

Qq precisions supplementaires :

 

Ca marche nickel-chrome sur AutoCAD 2007 et 2008

 

Ca deconne complet sur AutoCAD 2002 / 2004 / 2005 / 2006

 

Ca marche toujours si la polyligne a un SEUL segment !

 

Avec 2002/2004/2005/2006, lorsque la polyligne ouverte a 2 segments ou plus :

 

CORRIDOR.lsp dessine le decalage de chaque coté de la polyligne ouverte = OK

 

puis dessine une ligne qui part de l'extrémité du 1er decalage, suit le decalage ( !!! ) de la longueur du rectangle puis FONCE à la derniere extrémité du decalage

 

avec le msg d'erreur evoqué dans mon message précédent ...

 

Avec 2002/2004/2005/2006, lorsque la polyligne est close :

 

CORRIDOR.lsp dessine le decalage de chaque coté de la polyligne close = OK

et se plante avec l'erreur:

Erreur: Erreur Automation Index incorrect

 

et il y a 2 polylignes dessinées à l'intérieur !!!

c'est surement la fameuse polyligne qui se dessine lors du cas d'une polyline non clsoe !

 

Voilu, voilo, voila, Le Decapode "testeur"

 

 

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

 

Hello

 

Qq precisions supplementaires :

 

Ca marche nickel-chrome sur AutoCAD 2007 et 2008

 

Ca deconne complet sur AutoCAD 2002 / 2004 / 2005 / 2006

 

Ca marche toujours si la polyligne a un SEUL segment !

 

Avec 2002/2004/2005/2006, lorsque la polyligne ouverte a 2 segments ou plus :

 

CORRIDOR.lsp dessine le decalage de chaque coté de la polyligne ouverte = OK

 

puis dessine une ligne qui part de l'extrémité du 1er decalage, suit le decalage ( !!! ) de la longueur du rectangle puis FONCE à la derniere extrémité du decalage

 

avec le msg d'erreur evoqué dans mon message précédent ...

 

Avec 2002/2004/2005/2006, lorsque la polyligne est close :

 

CORRIDOR.lsp dessine le decalage de chaque coté de la polyligne close = OK

et se plante avec l'erreur:

Erreur: Erreur Automation Index incorrect

 

et il y a 2 polylignes dessinées à l'intérieur !!!

c'est surement la fameuse polyligne qui se dessine lors du cas d'une polyline non clsoe !

 

Voilu, voilo, voila, Le Decapode "testeur"

 

 

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut et merci pour les tests.

 

Je fais ça en aveugle n'ayant que 2007 sous la main.

 

Je pense que le problème vient de la sous routine CutPlineAtPoint, je te propose de tester en chargeant cette nouvelle version de CutLineAtpoint.

 

;;; CutPlineAtPoint
;;; Coupe la polyligne au point spécifié et retourne la liste des deux objets générés
;;; (ename ou vla-object selon le type de l'argument pl)
;;; 
;;; Arguments
;;; pl : la polyligne à couper (ename ou vla-object)
;;; pt : le point de coupure sur la polyligne (coordonnées SCG)

(defun CutPlineAtPoint (pl pt / ec vl)
 (and (= (type pl) 'VLA-OBJECT)
      (setq pl	(vlax-vla-object->ename pl)
     vl	T
      )
 )
 (setq ec (getvar "cmdecho"))
 (setvar "cmdecho" 0)
 (vl-cmdf "_.break" pl "_non" (trans pt 0 1) "_non" "@")
 (setvar "cmdecho" ec)
 (if vl
   (list (vlax-ename->vla-object pl)
  (vlax-ename->vla-object (entlast))
   )
   (list pl (entlast))
 )
) 

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Gilles

 

C Super, ca marche avec toutes les versions maintenant ! :)

 

Cependant parfois, ça déconne un peu sur la dernière boite d'une polyligne close ! :casstet:

 

Donc je t'envoie par MP mon DWG de test et la routine CORRIDOR2.LSP

pour correction et amélioration SVP :D

 

Je suggère l'amélioration suivante en début de routine:

 

- Question : Voulez vous une numérotation des boites ?

 

- Si OUI, poser la question valeur de départ ?

- avec dernière valeur incrémentée par défaut

- ou sinon 1

- ou sinon saisie au clavier de la valeur de départ

 

- Question : Hauteur du texte ?

 

- Génération d'un texte simple au centre de chaque rectangle / boîte !

 

Merci d'avance, Le Decapode "testeur chieur"

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

 

ReBonjour Gilles

 

C parti ... Merci :)

 

Sinon comme d'hab, attention au style de texte en cours dont la hauteur serait FIXEE !

c'est à dire différente de ZERO !!

 

Ca m'énerve prodigieusement les styles de textes avec une hauteur 0 :o :( :mad:

 

Autre suggestion: si on lance plusieurs fois la routine dans une meme session de DWG

proposer en longueur / largeur les dernières valeurs utilisées :cool:

 

Encore merci pour ta routine :) :D :cool: ;)

 

Le Decapode "hyper-chieur"

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Voilà une nouvelle version dans laquelle je pense avoir fixé les problèmes géométriques.

 

Elle fonctionne avec les polylignes ouvertes, fermées, avec ou sans arcs, quelque soit le SCU courant et le SCO de la polyligne.

 

Je rajouterai la possibilité de numérotation plus tard...

 

EDIT : décelé et réparé un bug

 

(defun c:corridor (/	  erreur JoinPlines    AcDoc  Space  inc
	   ht	  ent	 long	larg   pl0    nor    pl1
	   pl2	  ps1	 ps2	nb     n      pt0    pa0
	   pt1	  pt2	 cut1	cut2 txt
	  )

 (vl-load-com)

 ;; Redéfintion de *error* (fermeture du groupe d'annulation)
 (defun erreur	(msg)
   (if	(= msg "Fonction annulée")
     (princ)
     (princ (strcat "\nErreur: " msg))
   )
   (vla-endundomark
     (vla-get-activedocument (vlax-get-acad-object))
   )
   (setq *error* m:err
  m:err	nil
   )
   (princ)
 )

 ;; Joint deux polylignes en une polyligne fermée
 (defun JoinPlines (p1 p2 / v1 v2 i lst pl)
   (setq v1 (fix (vlax-curve-getEndParam p1))
  v2 (fix (vlax-curve-getEndParam p2))
  i  0
   )
   (repeat v1
     (setq lst	(cons (cons i (vla-getBulge p1 i)) lst)
    i	(1+ i)
     )
   )
   (setq i (1+ i))
   (repeat v2
     (setq lst	(cons (cons i (- (vla-GetBulge p2 (setq v2 (1- v2))))) lst)
    i	(1+ i)
     )
   )
   (setq pl
   (vlax-invoke
     Space
     'addLightWeightPolyline
     (append (vlax-get p1 'Coordinates)
	     (apply 'append
		    (reverse (split-list (vlax-get p2 'Coordinates) 2))
	     )
     )
   )
   )
   (vla-put-Closed pl :vlax-true)
   (mapcar '(lambda (x) (vla-SetBulge pl (car x) (cdr x))) lst)
   (vla-put-Normal pl (vla-get-Normal p1))
   (vla-put-Elevation pl (vla-get-Elevation p1))
   (vla-delete p1)
   (vla-delete p2)
   pl
 )

 ;; Fonction principale
 (setq	AcDoc	(vla-get-ActiveDocument (vlax-get-acad-object))
Space	(if (= (getvar "CVPORT") 1)
	  (vla-get-PaperSpace AcDoc)
	  (vla-get-ModelSpace AcDoc)
	)
m:err	*error*
*error*	erreur
 )
 (or (vlax-ldata-get "corridor" "long")
     (vlax-ldata-put "corridor" "long" 40.0)
 )
 (or (vlax-ldata-get "corridor" "larg")
     (vlax-ldata-put "corridor" "larg" 20.0)
 )
 (while (not
   (setq ent (car (entsel "\nSélectionner une polyligne: ")))
 )
 )
 (initget 6)
 (if (setq long
     (getdist (strcat "\nLongueur des boites 			      (rtos (vlax-ldata-get "corridor" "long"))
		      ">: "
	      )
     )
     )
   (vlax-ldata-put "corridor" "long" long)
   (setq long (vlax-ldata-get "corridor" "long"))
 )
 (initget 6)
 (if (setq larg
     (getdist (strcat "\nLongueur des boites 			      (rtos (vlax-ldata-get "corridor" "larg"))
		      ">: "
	      )
     )
     )
   (vlax-ldata-put "corridor" "larg" larg)
   (setq larg (vlax-ldata-get "corridor" "larg"))
 )
 (vla-StartUndoMark AcDoc)
 (setq	pl0 (vlax-ename->vla-object ent)
nor (vlax-get pl0 'Normal)
pl1 (car (vlax-invoke pl0 'Offset (/ larg 2.0)))
pl2 (car (vlax-invoke pl0 'Offset (/ larg -2.0)))
ps1 (trans (vlax-curve-getPointAtParam pl1 0) 0 nor)
ps2 (trans (vlax-curve-getPointAtParam pl2 0) 0 nor)
nb  (fix
      (/ (vlax-curve-getDistAtParam
	   pl0
	   (vlax-curve-getEndParam pl0)
	 )
	 long
      )
    )
n   1
 )
 (repeat nb
   (setq pt0 (vlax-curve-getPointAtDist pl0 (* n long))
  pa0 (vlax-curve-getParamatpoint pl0 pt0)
   )
   (if	(equal pa0 (fix pa0) 1e-9)
     (setq pt1	(vlax-curve-getPointatParam pl1 1)
    pt2	(vlax-curve-getPointatParam pl2 1)
     )
     (setq pt1	(vlax-curve-getClosestPointTo pl1 pt0)
    pt2	(vlax-curve-getClosestPointTo pl2 pt0)
     )
   )
   (setq cut1 (CutPlineAtPoint pl1 pt1)
  cut2 (CutPlineAtPoint pl2 pt2)
   )
   (cond
     ((not (car cut1))
      (vlax-put pl2
	 'Coordinates
	 (append (vlax-get pl2 'Coordinates)
		 (reverse (cdr (reverse (trans pt1 0 nor))))
	 )
      )
      (vla-put-Closed pl2 :vlax-true)
      (vla-put-Layer pl2 (getvar "CLAYER"))
     )
     ((not (car cut2))
      (vlax-put pl1
	 'Coordinates
	 (append (vlax-get pl1 'Coordinates)
		 (reverse (cdr (reverse (trans pt2 0 nor))))
	 )
      )
      (vla-put-Closed pl1 :vlax-true)
      (vla-put-Layer pl1 (getvar "CLAYER"))
     )
     (T (JoinPlines (car cut1) (car cut2)))
   )
   (setq n   (1+ n)
  inc (1+ inc)
  pl1 (cadr cut1)
  pl2 (cadr cut2)
   )
 )
 (cond
   ((not pl1)
    (vlax-put pl2
       'Coordinates
       (append (vlax-get pl2 'Coordinates)
	       (list (car ps1) (cadr ps1))
       )
    )
    (vla-put-Closed pl2 :vlax-true)
    (vla-put-Layer pl2 (getvar "CLAYER"))
   )
   ((not pl2)
    (vlax-put pl1
       'Coordinates
       (append (vlax-get pl1 'Coordinates)
	       (list (car ps2) (cadr ps2))
       )
    )
    (vla-put-Closed pl1 :vlax-true)
    (vla-put-Layer pl1 (getvar "CLAYER"))
   )
   (T (JoinPlines pl1 pl2))
 )
 (vlax-ldata-put "corridor" "num" inc)
 (vla-EndUndoMark AcDoc)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
)

;;;************************* SOUS ROUTINES *************************;;;

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

;;; 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)
 )
)

;;; 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 -1) -> (3 4 5 6)
;;; (sublst '(1 2 3 4 5 6) 3 12) -> (3 4 5 6)
;;; (sublst '(1 2 3 4 5 6) 3 nil) -> (3 4 5 6)
(defun sublst (lst start leng / rslt)
 (or (      (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 liste à 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)
   )
 )
)

;;; CutPlineAtPoint
;;; Coupe la polyligne au point spécifié et retourne la liste des deux objets générés
;;; (ename ou vla-object selon le type de l'argument pl)
;;; 
;;; Arguments
;;; pl : la polyligne à couper (ename ou vla-object)
;;; pt : le point de coupure sur la polyligne (coordonnées SCG)

(defun CutPlineAtPoint (pl pt / ec vl lst)
 (and (= (type pl) 'VLA-OBJECT)
      (setq pl	(vlax-vla-object->ename pl)
     vl	T
      )
 )
 (cond
   ((equal pt (vlax-curve-getEndPoint pl) 1e-9)
    (setq lst (list pl nil))
   )
   ((equal pt (vlax-curve-getStartPoint pl) 1e-9)
    (setq lst (list nil pl))
   )
   ((null (vlax-curve-getParamAtPoint pl pt))
    (setq lst (list pl nil))
   )
   (T
    (setq ec (getvar "cmdecho"))
    (setvar "cmdecho" 0)
    (vl-cmdf "_.break" pl "_non" (trans pt 0 1) "_non" "@")
    (setvar "cmdecho" ec)
    (setq lst (list pl (entlast)))
   )
 )
 (if vl
   (mapcar '(lambda (x)
       (if x
	 (vlax-ename->vla-object x)
       )
     )
    lst
   )
   lst
 )
) 

 

[Edité le 2/7/2007 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Gilles

 

C TIP TOP :) :D :cool:

 

J'ai testé et validé sur AutoCAD/MAP 2002 et 2006 et 2008 !

 

Donc je suis sur que ca fonctionne aussi sur AutoCAD / MAP 2004 & 2005 :P

 

Ta réactivité et efficacité sont exceptionnelles = BRAVO !

 

Le Decapode "chapeau bas"

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Voilà la version avec texte incrémenté.

 

EDIT : correction d'undysfonctionnement pour l'option "Non" à la numérotation.

 

(defun c:corridor (/	  erreur JoinPlines    AcDoc  Space  inc
	   ht	  ent	 long	larg   pl0    nor    pl1
	   pl2	  ps1	 ps2	nb     n      pt0    pa0
	   pt1	  pt2	 cut1	cut2   txt
	  )

 (vl-load-com)

 ;; Redéfintion de *error* (fermeture du groupe d'annulation)
 (defun erreur	(msg)
   (if	(= msg "Fonction annulée")
     (princ)
     (princ (strcat "\nErreur: " msg))
   )
   (vla-endundomark
     (vla-get-activedocument (vlax-get-acad-object))
   )
   (setq *error* m:err
  m:err	nil
   )
   (princ)
 )

 ;; Joint deux polylignes en une polyligne fermée
 (defun JoinPlines (p1 p2 / v1 v2 i lst pl)
   (setq v1 (fix (vlax-curve-getEndParam p1))
  v2 (fix (vlax-curve-getEndParam p2))
  i  0
   )
   (repeat v1
     (setq lst	(cons (cons i (vla-getBulge p1 i)) lst)
    i	(1+ i)
     )
   )
   (setq i (1+ i))
   (repeat v2
     (setq lst	(cons (cons i (- (vla-GetBulge p2 (setq v2 (1- v2))))) lst)
    i	(1+ i)
     )
   )
   (setq pl
   (vlax-invoke
     Space
     'addLightWeightPolyline
     (append (vlax-get p1 'Coordinates)
	     (apply 'append
		    (reverse (split-list (vlax-get p2 'Coordinates) 2))
	     )
     )
   )
   )
   (vla-put-Closed pl :vlax-true)
   (mapcar '(lambda (x) (vla-SetBulge pl (car x) (cdr x))) lst)
   (vla-put-Normal pl (vla-get-Normal p1))
   (vla-put-Elevation pl (vla-get-Elevation p1))
   (vla-delete p1)
   (vla-delete p2)
   pl
 )

 ;; Fonction principale
 (setq	AcDoc	(vla-get-ActiveDocument (vlax-get-acad-object))
Space	(if (= (getvar "CVPORT") 1)
	  (vla-get-PaperSpace AcDoc)
	  (vla-get-ModelSpace AcDoc)
	)
m:err	*error*
*error*	erreur
 )
 (or (vlax-ldata-get "corridor" "long")
     (vlax-ldata-put "corridor" "long" 40.0)
 )
 (or (vlax-ldata-get "corridor" "larg")
     (vlax-ldata-put "corridor" "larg" 20.0)
 )
 (or (vlax-ldata-get "corridor" "num")
     (vlax-ldata-put "corridor" "num" 1)
 )
 (initget "Oui Non")
 (if
   (/=	"Non"
(getkword "\Numéroter les boites ? [Oui/Non] : ")
   )
    (progn
      (if (setq inc
	  (getint (strcat "\nEntrez le numéro de départ 				  (itoa (vlax-ldata-get "corridor" "num"))
			  ">: "
		  )
	  )
   )
 (vlax-ldata-put "corridor" "num" inc)
 (setq inc (vlax-ldata-get "corridor" "num"))
      )
      (if (setq ht (getdist (strcat "\nSpécifiez la hauteur de texte 				     (rtos (getvar "TEXTSIZE"))
			     ">: "
		     )
	    )
   )
 (setvar "TEXTSIZE" ht)
 (setq ht (getvar "TEXTSIZE"))
      )
    )
 )
 (while (not
   (setq ent (car (entsel "\nSélectionner une polyligne: ")))
 )
 )
 (initget 6)
 (if (setq long
     (getdist (strcat "\nLongueur des boites 			      (rtos (vlax-ldata-get "corridor" "long"))
		      ">: "
	      )
     )
     )
   (vlax-ldata-put "corridor" "long" long)
   (setq long (vlax-ldata-get "corridor" "long"))
 )
 (initget 6)
 (if (setq larg
     (getdist (strcat "\nLargeur des boites 			      (rtos (vlax-ldata-get "corridor" "larg"))
		      ">: "
	      )
     )
     )
   (vlax-ldata-put "corridor" "larg" larg)
   (setq larg (vlax-ldata-get "corridor" "larg"))
 )
 (vla-StartUndoMark AcDoc)
 (setq	pl0 (vlax-ename->vla-object ent)
nor (vlax-get pl0 'Normal)
pl1 (car (vlax-invoke pl0 'Offset (/ larg 2.0)))
pl2 (car (vlax-invoke pl0 'Offset (/ larg -2.0)))
ps1 (trans (vlax-curve-getPointAtParam pl1 0) 0 nor)
ps2 (trans (vlax-curve-getPointAtParam pl2 0) 0 nor)
nb  (fix
      (/ (vlax-curve-getDistAtParam
	   pl0
	   (vlax-curve-getEndParam pl0)
	 )
	 long
      )
    )
n   1
 )
 (repeat nb
   (setq pt0 (vlax-curve-getPointAtDist pl0 (* n long))
  pa0 (vlax-curve-getParamatpoint pl0 pt0)
   )
   (if	(equal pa0 (fix pa0) 1e-9)
     (setq pt1	(vlax-curve-getPointatParam pl1 1)
    pt2	(vlax-curve-getPointatParam pl2 1)
     )
     (setq pt1	(vlax-curve-getClosestPointTo pl1 pt0)
    pt2	(vlax-curve-getClosestPointTo pl2 pt0)
     )
   )
   (setq cut1 (CutPlineAtPoint pl1 pt1)
  cut2 (CutPlineAtPoint pl2 pt2)
   )
   (cond
     ((not (car cut1))
      (vlax-put pl2
	 'Coordinates
	 (append (vlax-get pl2 'Coordinates)
		 (reverse (cdr (reverse (trans pt1 0 nor))))
	 )
      )
      (vla-put-Closed pl2 :vlax-true)
      (vla-put-Layer pl2 (getvar "CLAYER"))
     )
     ((not (car cut2))
      (vlax-put pl1
	 'Coordinates
	 (append (vlax-get pl1 'Coordinates)
		 (reverse (cdr (reverse (trans pt2 0 nor))))
	 )
      )
      (vla-put-Closed pl1 :vlax-true)
      (vla-put-Layer pl1 (getvar "CLAYER"))
     )
     (T (JoinPlines (car cut1) (car cut2)))
   )
   (if	inc
     (progn
(setq txt
       (vla-addText
	 Space
	 (itoa inc)
	 (vlax-3d-point '(0 0 0))
	 ht
       )
)
(vla-put-Normal txt (vlax-3d-point nor))
(vla-put-Alignment txt 10)
(vla-put-TextAlignmentPoint
  txt
  (vlax-3d-point
    (vlax-curve-getPointAtDist pl0 (- (* n long) (/ long 2)))
  )
)
(setq inc (1+ inc))
     )
   )
   (setq n   (1+ n)
  pl1 (cadr cut1)
  pl2 (cadr cut2)
   )
 )
 (cond
   ((not pl1)
    (vlax-put pl2
       'Coordinates
       (append (vlax-get pl2 'Coordinates)
	       (list (car ps1) (cadr ps1))
       )
    )
    (vla-put-Closed pl2 :vlax-true)
    (vla-put-Layer pl2 (getvar "CLAYER"))
   )
   ((not pl2)
    (vlax-put pl1
       'Coordinates
       (append (vlax-get pl1 'Coordinates)
	       (list (car ps2) (cadr ps2))
       )
    )
    (vla-put-Closed pl1 :vlax-true)
    (vla-put-Layer pl1 (getvar "CLAYER"))
   )
   (T (JoinPlines pl1 pl2))
 )
 (if inc
   (progn
     (setq txt
     (vla-addText
       Space
       (itoa inc)
       (vlax-3d-point '(0 0 0))
       ht
     )
     )
     (vla-put-Normal txt (vlax-3d-point nor))
     (vla-put-Alignment txt 10)
     (vla-put-TextAlignmentPoint
txt
(vlax-3d-point
  (vlax-curve-getPointAtDist
    pl0
    (/ (+ (vlax-curve-getDistatPoint pl0 pt0)
	  (vlax-curve-getDistAtParam
	    pl0
	    (vlax-curve-getEndParam pl0)
	  )
       )
       2.0
    )
  )
)
     )
     (vlax-ldata-put "corridor" "num" (1+ inc))
   )
 )
 (vla-EndUndoMark AcDoc)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
)

;;;************************* SOUS ROUTINES *************************;;;

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

;;; 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)
 )
)

;;; 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 -1) -> (3 4 5 6)
;;; (sublst '(1 2 3 4 5 6) 3 12) -> (3 4 5 6)
;;; (sublst '(1 2 3 4 5 6) 3 nil) -> (3 4 5 6)
(defun sublst (lst start leng / rslt)
 (or (      (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 liste à 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)
   )
 )
)

;;; CutPlineAtPoint
;;; Coupe la polyligne au point spécifié et retourne la liste des deux objets générés
;;; (ename ou vla-object selon le type de l'argument pl)
;;; 
;;; Arguments
;;; pl : la polyligne à couper (ename ou vla-object)
;;; pt : le point de coupure sur la polyligne (coordonnées SCG)

(defun CutPlineAtPoint (pl pt / ec vl lst)
 (vl-load-com)
 (and (= (type pl) 'VLA-OBJECT)
      (setq pl	(vlax-vla-object->ename pl)
     vl	T
      )
 )
 (cond
   ((equal pt (vlax-curve-getEndPoint pl) 1e-9)
    (setq lst (list pl nil))
   )
   ((equal pt (vlax-curve-getStartPoint pl) 1e-9)
    (setq lst (list nil pl))
   )
   ((null (vlax-curve-getParamAtPoint pl pt))
    (setq lst (list pl nil))
   )
   (T
    (setq ec (getvar "cmdecho"))
    (setvar "cmdecho" 0)
    (vl-cmdf "_.break" pl "_non" (trans pt 0 1) "_non" "@")
    (setvar "cmdecho" ec)
    (setq lst (list pl (entlast)))
   )
 )
 (if vl
   (mapcar '(lambda (x)
       (if x
	 (vlax-ename->vla-object x)
       )
     )
    lst
   )
   lst
 )
) 

 

PS pour lecrabe :

 

Pour les styles de texte avec une hauteur non nulle, une petite routine qui remet tous les style de texte du dessin à une hauteur 0.0

 

(defun c:HT0 ()
 (vl-load-com)
 (vlax-for ts (vla-get-textstyles
	 (vla-get-activedocument (vlax-get-acad-object))
       )
   (vla-put-Height ts 0.0)
 )
 (princ)
) 

 

et puisqu'on en est au ménage, j'ai répondu à une de tes demandes en souffrance ici et il y a quelque temps à une autre .

 

[Edité le 19/7/2007 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

salut à tous,

 

un petit tour sur le site et quelle suprise !!!!!!!!

 

merci gile pour la rapidité de ta réponse.

 

je le télécharge et j'essaye ça.

 

à + doy

 

et encore merci, cela fait plaisir de ne pas se sentir seul devant un problème

quand on débute et de ne plus avoir un écran vide de sens.

( ps : un petit mot pour charlie69 qui ne donne plus de nouvelle).

 

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour à tous

et merci gile pour tes conseils et explications.

 

j'ai essayé le programme et formidable il fonctionne à merveille

 

j'ai changer les couleurs et attributions des calques pour les boites et les textes

ça marche à peu près mais j'ai toujours un petit soucis car le dernier chiffre reste dans sa couleur et calque d'origine.

 

j'essais de faire une boîte de dialogue mais comme je ne comprend pas tourjours tous dans ton programme il me manque des explications sur par exemple ce que définis exactement "num" ai je bien compris s'agit il de l'abréviation de numérotation ou est ce autre chose.

 

en tout cas il fonctionne et ça s'est super

 

encore merci.

 

à + doy.

Lien vers le commentaire
Partager sur d’autres sites

il me manque des explications sur par exemple ce que définis exactement "num" ai je bien compris s'agit il de l'abréviation de numérotation ou est ce autre chose

 

Les fonctions (vlax-ldata-put ...) (vlax-ldata-get ...) permettent de stocker (et de récupérer) des données dans le dessin, elles requièrent comme premiers arguments :

- un dictionnaire (ou une entité) auquel la donnée est liée

- une clé pour définir (ou retrouver) la donnée dans le dictionnaire.

 

Le dictionnaire et la clé sont des chaines de caractères choisies par le programmeur, personnellement, j'utilise pour le dictionnaire le même nom que la routine et pour les clés des noms que je pense explicite, mais on peut choisir ce que l'on veut (en essayant d'éviter de redéfinir des données "ldata" qui pourraient déjà exister dans le dessin.

 

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

Lien vers le commentaire
Partager sur d’autres sites

J'ai réparé un dysfonctionnement dans corridor, quand on choisissait l'option sans numérotation des "boites".

La version donnée plus haut (postée le 2/7/2007 à 21:08) a été mise à jour.

 

D'autre part, je persiste à essayer de finaliser une routine "CutPlineAtPoint" qui n'utiliserait pas la fonction "command" (exécution plus rapide malgrè un code plus long).

Les précedentes versions ne fonctionnaient pas avec les versions antérieures à 2007.

Si certains fidèles testeurs voulaient bien essayer la version ci dessous sur différentes versions d'AutoCAD, et signaler si elle pose toujours problème.

Merci d'avance.

 

(defun c:corridor (/	  erreur JoinPlines    AcDoc  Space  inc
	   ht	  ent	 long	larg   pl0    nor    pl1
	   pl2	  ps1	 ps2	nb     n      pt0    pa0
	   pt1	  pt2	 cut1	cut2   txt
	  )

 (vl-load-com)

 ;; Redéfintion de *error* (fermeture du groupe d'annulation)
 (defun erreur	(msg)
   (if	(= msg "Fonction annulée")
     (princ)
     (princ (strcat "\nErreur: " msg))
   )
   (vla-endundomark
     (vla-get-activedocument (vlax-get-acad-object))
   )
   (setq *error* m:err
  m:err	nil
   )
   (princ)
 )

 ;; Joint deux polylignes en une polyligne fermée
 (defun JoinPlines (p1 p2 / v1 v2 i lst pl)
   (setq v1 (fix (vlax-curve-getEndParam p1))
  v2 (fix (vlax-curve-getEndParam p2))
  i  0
   )
   (repeat v1
     (setq lst	(cons (cons i (vla-getBulge p1 i)) lst)
    i	(1+ i)
     )
   )
   (setq i (1+ i))
   (repeat v2
     (setq lst	(cons (cons i (- (vla-GetBulge p2 (setq v2 (1- v2))))) lst)
    i	(1+ i)
     )
   )
   (setq pl
   (vlax-invoke
     Space
     'addLightWeightPolyline
     (append (vlax-get p1 'Coordinates)
	     (apply 'append
		    (reverse (split-list (vlax-get p2 'Coordinates) 2))
	     )
     )
   )
   )
   (vla-put-Closed pl :vlax-true)
   (mapcar '(lambda (x) (vla-SetBulge pl (car x) (cdr x))) lst)
   (vla-put-Normal pl (vla-get-Normal p1))
   (vla-put-Elevation pl (vla-get-Elevation p1))
   (vla-delete p1)
   (vla-delete p2)
   pl
 )

 ;; Fonction principale
 (setq	AcDoc	(vla-get-ActiveDocument (vlax-get-acad-object))
Space	(if (= (getvar "CVPORT") 1)
	  (vla-get-PaperSpace AcDoc)
	  (vla-get-ModelSpace AcDoc)
	)
m:err	*error*
*error*	erreur
 )
 (or (vlax-ldata-get "corridor" "long")
     (vlax-ldata-put "corridor" "long" 40.0)
 )
 (or (vlax-ldata-get "corridor" "larg")
     (vlax-ldata-put "corridor" "larg" 20.0)
 )
 (or (vlax-ldata-get "corridor" "num")
     (vlax-ldata-put "corridor" "num" 1)
 )
 (initget "Oui Non")
 (if
   (/=	"Non"
(getkword "\Numéroter les boites ? [Oui/Non] < Oui >: ")
   )
    (progn
      (if (setq inc
	  (getint (strcat "\nEntrez le numéro de départ <"
			  (itoa (vlax-ldata-get "corridor" "num"))
			  ">: "
		  )
	  )
   )
 (vlax-ldata-put "corridor" "num" inc)
 (setq inc (vlax-ldata-get "corridor" "num"))
      )
      (if (setq ht (getdist (strcat "\nSpécifiez la hauteur de texte <"
			     (rtos (getvar "TEXTSIZE"))
			     ">: "
		     )
	    )
   )
 (setvar "TEXTSIZE" ht)
 (setq ht (getvar "TEXTSIZE"))
      )
    )
 )
 (while (not
   (setq ent (car (entsel "\nSélectionner une polyligne: ")))
 )
 )
 (initget 6)
 (if (setq long
     (getdist (strcat "\nLongueur des boites <"
		      (rtos (vlax-ldata-get "corridor" "long"))
		      ">: "
	      )
     )
     )
   (vlax-ldata-put "corridor" "long" long)
   (setq long (vlax-ldata-get "corridor" "long"))
 )
 (initget 6)
 (if (setq larg
     (getdist (strcat "\nLongueur des boites <"
		      (rtos (vlax-ldata-get "corridor" "larg"))
		      ">: "
	      )
     )
     )
   (vlax-ldata-put "corridor" "larg" larg)
   (setq larg (vlax-ldata-get "corridor" "larg"))
 )
 (vla-StartUndoMark AcDoc)
 (setq	pl0 (vlax-ename->vla-object ent)
nor (vlax-get pl0 'Normal)
pl1 (car (vlax-invoke pl0 'Offset (/ larg 2.0)))
pl2 (car (vlax-invoke pl0 'Offset (/ larg -2.0)))
ps1 (trans (vlax-curve-getPointAtParam pl1 0) 0 nor)
ps2 (trans (vlax-curve-getPointAtParam pl2 0) 0 nor)
nb  (fix
      (/ (vlax-curve-getDistAtParam
	   pl0
	   (vlax-curve-getEndParam pl0)
	 )
	 long
      )
    )
n   1
 )
 (repeat nb
   (setq pt0 (vlax-curve-getPointAtDist pl0 (* n long))
  pa0 (vlax-curve-getParamatpoint pl0 pt0)
   )
   (if	(equal pa0 (fix pa0) 1e-9)
     (setq pt1	(vlax-curve-getPointatParam pl1 1)
    pt2	(vlax-curve-getPointatParam pl2 1)
     )
     (setq pt1	(vlax-curve-getClosestPointTo pl1 pt0)
    pt2	(vlax-curve-getClosestPointTo pl2 pt0)
     )
   )
   (setq cut1 (CutPlineAtPoint pl1 pt1)
  cut2 (CutPlineAtPoint pl2 pt2)
   )
   (cond
     ((not (car cut1))
      (vlax-put pl2
	 'Coordinates
	 (append (vlax-get pl2 'Coordinates)
		 (reverse (cdr (reverse (trans pt1 0 nor))))
	 )
      )
      (vla-put-Closed pl2 :vlax-true)
      (vla-put-Layer pl2 (getvar "CLAYER"))
     )
     ((not (car cut2))
      (vlax-put pl1
	 'Coordinates
	 (append (vlax-get pl1 'Coordinates)
		 (reverse (cdr (reverse (trans pt2 0 nor))))
	 )
      )
      (vla-put-Closed pl1 :vlax-true)
      (vla-put-Layer pl1 (getvar "CLAYER"))
     )
     (T (JoinPlines (car cut1) (car cut2)))
   )
   (if	inc
     (progn
(setq txt
       (vla-addText
	 Space
	 (itoa inc)
	 (vlax-3d-point '(0 0 0))
	 ht
       )
)
(vla-put-Normal txt (vlax-3d-point nor))
(vla-put-Alignment txt 10)
(vla-put-TextAlignmentPoint
  txt
  (vlax-3d-point
    (vlax-curve-getPointAtDist pl0 (- (* n long) (/ long 2)))
  )
)
(setq inc (1+ inc))
     )
   )
   (setq n   (1+ n)
  pl1 (cadr cut1)
  pl2 (cadr cut2)
   )
 )
 (cond
   ((not pl1)
    (vlax-put pl2
       'Coordinates
       (append (vlax-get pl2 'Coordinates)
	       (list (car ps1) (cadr ps1))
       )
    )
    (vla-put-Closed pl2 :vlax-true)
    (vla-put-Layer pl2 (getvar "CLAYER"))
   )
   ((not pl2)
    (vlax-put pl1
       'Coordinates
       (append (vlax-get pl1 'Coordinates)
	       (list (car ps2) (cadr ps2))
       )
    )
    (vla-put-Closed pl1 :vlax-true)
    (vla-put-Layer pl1 (getvar "CLAYER"))
   )
   (T (JoinPlines pl1 pl2))
 )
 (if inc
   (progn
     (setq txt
     (vla-addText
       Space
       (itoa inc)
       (vlax-3d-point '(0 0 0))
       ht
     )
     )
     (vla-put-Normal txt (vlax-3d-point nor))
     (vla-put-Alignment txt 10)
     (vla-put-TextAlignmentPoint
txt
(vlax-3d-point
  (vlax-curve-getPointAtDist
    pl0
    (/ (+ (vlax-curve-getDistatPoint pl0 pt0)
	  (vlax-curve-getDistAtParam
	    pl0
	    (vlax-curve-getEndParam pl0)
	  )
       )
       2.0
    )
  )
)
     )
     (vlax-ldata-put "corridor" "num" (1+ inc))
   )
 )
 (vla-EndUndoMark AcDoc)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
)

;;;************************* SOUS ROUTINES *************************;;;

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

;;; 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)
 )
)

;;; 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 -1) -> (3 4 5 6)
;;; (sublst '(1 2 3 4 5 6) 3 12) -> (3 4 5 6)
;;; (sublst '(1 2 3 4 5 6) 3 nil) -> (3 4 5 6)
(defun sublst (lst start leng / rslt)
 (or (<= 1 leng (- (length lst) start))
     (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 liste à 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)
   )
 )
)

[surligneur];;; CutPlineAtPoint
;;; Coupe la polyligne au point spécifié et retourne la liste des deux objets générés
;;; (ename ou vla-object selon le type de l'argument pl)
;;; 
;;; Arguments
;;; pl : la polyligne à couper (ename ou vla-object)
;;; pt : le point de coupure sur la polyligne (coordonnées SCG)

(defun CutPlineAtPoint
	       (pl  pt	/   en	no  pa	p0  p1	pn  cl	l0  l1
		l2  ce	sp  c	b0  b1	b2  bp	a1  a2	n   wp
		w0  w1	w2
	       )
 (vl-load-com)
 (or (= (type pl) 'VLA-OBJECT)
     (setq pl (vlax-ename->vla-object pl)
    en T
     )
 )
 (setq	no (vlax-get pl 'Normal)
pa (fix (vlax-curve-getParamAtPoint pl pt))
p0 (vlax-curve-getPointAtparam pl pa)
p1 (vlax-curve-getPointAtParam pl (1+ pa))
pn (reverse (cdr (reverse (trans pt 0 no))))
cl (vla-Copy pl)
l0 (vlax-get pl 'Coordinates)
l1 (append (sublst l0 1 (* 2 (1+ pa))) pn)
l2 (append pn (sublst l0 (1+ (* 2 (1+ pa))) nil))
ce (if (not (equal pt p0 1e-9))
     (ArcCenterBy3Points (trans p0 0 no) pn (trans p1 0 no))
   )
sp (reverse
     (cdr (reverse (trans (vlax-curve-getStartPoint pl) 0 no)))
   )
 )
 (and (= (vla-get-Closed pl) :vlax-true)
      (setq c	T
     l2	(append l2 sp)
      )
 )
 (repeat (setq	n (if c
	    (fix (vlax-curve-getendParam pl))
	    (fix (1+ (vlax-curve-getendParam pl)))
	  )
  )
   (setq b0 (cons (vla-getBulge pl (setq n (1- n))) b0))
   (vla-GetWidth pl n 'StartWidth 'EndWidth)
   (setq w0 (cons (list StartWidth EndWidth) w0))
 )
 (setq bp (nth pa b0))
 (if ce
   (progn
     (setq a1 (- (angle ce pn) (angle ce (trans p0 0 no)))
    a2 (- (angle ce (trans p1 0 no)) (angle ce pn))
     )
     (if (minusp bp)
(foreach a '(a1 a2)
  (if (< 0 (eval a))
    (set a (- (eval a) (* 2 pi)))
  )
)
(foreach a '(a1 a2)
  (if (< (eval a) 0)
    (set a (+ (eval a) (* 2 pi)))
  )
)
     )
   )
 )
 (setq	b1 (append
     (if (zerop pa)
       nil
       (sublst b0 1 pa)
     )
     (if ce
       (list (Angle2Bulge a1))
       (list bp)
     )
   )
b2 (append
     (if ce
       (list (Angle2Bulge a2))
       (list bp)
     )
     (sublst b0 (+ 2 pa) nil)
   )
wp (if (equal pt p0 1e-9)
     (car (nth pa w0))
     (+	(car (nth pa w0))
	(* (- (cadr (nth pa w0)) (car (nth pa w0)))
	   (/ (- (vlax-curve-getDistAtPoint pl pt)
		 (vlax-curve-getDistAtParam pl pa)
	      )
	      (- (vlax-curve-getDistAtParam pl (1+ pa))
		 (vlax-curve-getDistAtParam pl pa)
	      )
	   )
	)
     )
   )
w1 (append (if (zerop pa)
	     nil
	     (sublst w0 1 pa)
	   )
	   (list (list (car (nth pa w0)) wp))
   )
w2 (append (list (list wp (cadr (nth pa w0))))
	   (sublst w0 (+ 2 pa) nil)
   )
 )
 (if c
   (progn
     (vla-put-Closed pl :vlax-false)
     (vla-put-Closed cl :vlax-false)
   )
 )
 (mapcar '(lambda (p l b w)
     (vlax-put p 'Coordinates l)
     (repeat (setq n (length B))
       (vla-SetBulge p (setq n (1- n)) (nth n B))
     )
     (repeat (setq n (length w))
       (vla-SetWidth
	 p
	 (setq n (1- n))
	 (car (nth n w))
	 (cadr (nth n w))
       )
     )
   )
  (list pl cl)
  (list l1 l2)
  (list b1 b2)
  (list w1 w2)
 )
 (if en
   (list (vlax-vla-object->ename pl)
  (vlax-vla-object->ename pl)
   )
   (list pl cl)
 )
) [/surligneur] 

[Edité le 21/7/2007 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Gilles

 

Sur mon AutoCAD / MAP 2005, voilà le résultat:

 

Debut >>>>>

Commande: corridor

Numéroter les boites ? [Oui/Non] :

 

Entrez le numéro de départ : 101

 

Spécifiez la hauteur de texte : 0.5

 

Sélectionner une polyligne:

Longueur des boites : 6

 

Longueur des boites : 2

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

; avertissement: fonction unwind ignorée erreur inconnue

 

L'erreur est identique que la polyligne soit close ou non !

 

Il dessine les 2 décalages et se casse la figure tout de suite avec une ligne qui part du dernier point du dernier décalage (sans doute) pour aller à peu près au milieu du 1er segment du 1er décalage !

 

Aucune boîte n'est dessinée

 

Même problème avec ou sans la numérotation !!

 

Désolé, Le Decapode

 

 

 

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Hello Gilles

 

Pour les versions antérieures à QUOI ?

 

Je ne comprend plus ...

 

L'ancienne version fonctionne t-elle sur TOUTES les versions ?

et Avec ou Sans la numérotation ?

 

La nouvelle version fonctionne sur 2007 / 2008 ?

Avec ou Sans la numérotation ?

Mais elle est plus performante, si j'ai bien entendu ...

 

Le Decapode "indécis"

 

 

[Edité le 20/7/2007 par lecrabe]

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Pour 2007/2008 on peut utiliser, dand le LISP corridor, la routine CutPlineAtPoint (surlignée) donnée ci-dessus (réponse 11).

Sinon, il faut la remplacer dans le LISP ci-dessus par celle-là :

 

;;; CutPlineAtPoint
;;; Coupe la polyligne au point spécifié et retourne la liste des deux objets générés
;;; (ename ou vla-object selon le type de l'argument pl)
;;;
;;; Arguments
;;; pl : la polyligne à couper (ename ou vla-object)
;;; pt : le point de coupure sur la polyligne (coordonnées SCG)

(defun CutPlineAtPoint (pl pt / ec vl lst)
(vl-load-com)
(and (= (type pl) 'VLA-OBJECT)
(setq pl (vlax-vla-object->ename pl)
vl T
)
)
(cond
((equal pt (vlax-curve-getEndPoint pl) 1e-9)
(setq lst (list pl nil))
)
((equal pt (vlax-curve-getStartPoint pl) 1e-9)
(setq lst (list nil pl))
)
((null (vlax-curve-getParamAtPoint pl pt))
(setq lst (list pl nil))
)
(T
(setq ec (getvar "cmdecho"))
(setvar "cmdecho" 0)
(vl-cmdf "_.break" pl "_non" (trans pt 0 1) "_non" "@")
(setvar "cmdecho" ec)
(setq lst (list pl (entlast)))
)
)
(if vl
(mapcar '(lambda (x)
(if x
(vlax-ename->vla-object x)
)
)
lst
)
lst
)
)

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

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é