Aller au contenu

Probleme projection orthogonale


Messages recommandés

Posté(e)

Bonjour,

 

J'ai récupérer ton lisp gile ui permet de projeter orthogonalement suivant l'axe Y des blocs sur une polyligne ou une courbe.

 ;; PtOnCurveY (gile)
;; Déplace parallèlement à l'axe Y les points, blocs textes sélectionnés sur la courbe

(defun c:MoveOnCurveY (/ space dist curve pts coord line)
(vl-load-com)
(or *acdoc*
(setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
)
(setq space (if (= (getvar "CVPORT") 1)
(vla-get-PaperSpace *acdoc*)
(vla-get-ModelSpace *acdoc*)
)
)
(if
(and
(setq dist (getdist "\nSpécifiez la longueur maximale: "))
(setq curve (car (entsel "\nSélectionnez la courbe: ")))
(setq curve (vlax-ename->vla-object curve))
(IsCurveObject curve)
(princ "\nSélectionnez les points, blocs ou textes: ")
(ssget '((0 . "POINT,INSERT,MTEXT,TEXT")))
)
(vlax-for pt (setq pts (vla-get-ActiveSelectionSet
(vla-get-ActiveDocument
(vlax-get-acad-object)
)
)
)
(if (= (vla-get-ObjectName pt) "AcDbPoint")
(setq coord (vlax-get pt 'Coordinates))
(setq coord (vlax-get pt 'InsertionPoint))
)
(setq line
(vla-addLine
space
(vlax-3d-point
(list (car coord) (- (cadr coord) dist) (caddr coord))
)
(vlax-3d-point
(list (car coord) (+ (cadr coord) dist) (caddr coord))
)
)
)
(if
(setq int (vlax-invoke curve 'IntersectWith line acExtendNone))
(vlax-put pt
(if (= (vla-get-ObjectName pt) "AcDbPoint")
'Coordinates
'InsertionPoint
)
(list (car int) (cadr int) (caddr int))
)
)
(vla-delete line)
)
)
(princ)
)


;; IsCurveObject
;; Evalue si un objet (ename ou vla-object) est un "CurveObject"

(defun IsCurveObject (obj)
(and
(or (= (type obj) 'VLA-OBJECT)
(setq obj (vlax-ename->vla-object obj))
)
(member (vla-get-ObjectName obj)
'("AcDbArc" "AcDbCircle"
"AcDbEllipse" "AcDbLine"
"AcDbPolyline" "AcDb2dPolyline"
"AcDb3dPolyline" "Acdb2dSpline"
)
)
)
)  

Pourquoi ce lisp ne marche ou du moins ne déplace pas les blocs sélectionnés sur l'axe en question en conservant si possible le Z de départ ?

 

Merci par avance de votre.

Chris_mtp

Posté(e)

Salut,

 

Pourquoi ce lisp ne marche ou du moins ne déplace pas les blocs sélectionnés sur l'axe en question en conservant si possible le Z de départ ?

 

Parce qu'il n'est pas prévu pour ça. La demande était de replacer les points sur la polyligne.

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

Posté(e)

Dans ce cas, je n'ai pas copier le bon code car dans le sujet, il y a à la fin un lisp indiquant qu"on peut projeté des textes ou des blocs.

 

Sinon, serait il possible d'adapter ce lisp mais cette fois ci pour des blocs type point topo toujours suivant le même principe en les copiant si possible dans un autre calque et en les projetant suivant l'axe des Y sur une polyligne 2d?

 

Ceci, dans le but de créer une polyligne 3D par projection orthogonale de points topo. Pratique dans le cas de profils hydrauliques.

 

Merci par avance

Chris_mtp.

Posté(e)

Dans ce cas, je n'ai pas copier le bon code car dans le sujet, il y a à la fin un lisp indiquant qu"on peut projeté des textes ou des blocs.

 

Non, je pense que c'est le bon code, mais la demande était pour du dessin en 2d : déplacement des objets parallèlement à l'axe Y sur la polyligne (polyligne et objets ayant un Z=0).

 

Sinon, je ne comprends pas bien ta demande : points topo (3d), polyligne2d, polyligne 3d ???

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

Posté(e)

Bonjour

 

ce que tu demandes est réalisable simplement sans routine

 

il te suffit de dessiner la polyligne 3D avec les accrochages 3D

(points en 3D ou filtre X Y plus Z)

 

Ensuite pour dessiner le profil en long c'est une autre histoire,

il te faudra programmer ou utiliser Covadis.

 

je ne pense pas qu'une projection orthogonale

soit la solution dans le cas des réseaux.

comment gères-tu les coudes dans le réseau ?

 

amicalement

Posté(e)

Salut,

 

Désolé de ne pas vous avoir répondu avant mais j'étais parti en déplacement cette semaine.

Non, le but est de tracer une polyligne 2d pour indiquer l'emplacement d'un profil.

Des points topo sous forme de blocs en 3D sont situés de part et d'autre de cette polyligne 2D.

 

En mettant le scu objet le long de cette polyligne 2D, le but serait de projeter sur cette polyligne en les copiant les blocs 3D dans un autre calque pour à la fin tracer une polyligne 3D passant par les blocs 3D projetés.

 

J'ai testé le lisp avec les blocs à Z=0. En effet, ca marche bien.

le but serait en fait simplement d'adapter le lisp mais pour des blocs en 3D avec si possible la possibilité de copier les blocs à projeté dans un autre calque.

 

Ce n'est pas un problème de profil en long mais simplement de poly3D.

 

il te suffit de dessiner la polyligne 3D avec les accrochages 3D

(points en 3D ou filtre X Y plus Z)

 

Avec des projections orthogonales et une distance maximale de déport, c'est plus rapide surtout lorsqu'il faut tracer des profils avec 300 points par exemple.

 

Merci par avance de votre aide.

Chris_mtp.

Posté(e)

Salut,

 

Vite fait (si j'ai bien compris).

 

Devrait fonctionner dans le SCG, la polyligne doit être dans un plan parallèle au SCG.

 

(defun c:toto (/ blk pl elv dist ss ins p1 p2 new)
(or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (if
   (and
     (setq blk (car (entsel "\nSélectionnez un des blocs à traiter: ")))
     (setq blk (vlax-ename->vla-object blk))
     (= (vla-get-ObjectName blk) "AcDbBlockReference")
     (setq pl (car (entsel "\nSélectionnez la polyligne: ")))
     (setq pl (vlax-ename->vla-object pl))
     (= (vla-get-ObjectName pl) "AcDbPolyline")
     (setq elv (vla-get-Elevation pl))
     (setq dist (getdist "\nSpécifiez la longueur minimale: "))
     (ssget "_X"
     (list '(0 . "INSERT") (cons 2 (vla-get-Name blk)))
     )
   )
    (progn
      (vla-add (vla-get-Layers *acdoc*) "BLOCS_PROJETES")
      (vlax-for b (setq ss (vla-get-ActiveSelectionSet *acdoc*))
 (setq ins (vlax-get b 'InsertionPoint))
 (if
   (			 (setq p2 (vlax-curve-getClosestPointTo pl p1))
       )
       dist
   )
    (progn
      (setq new (vla-Copy b))
      (vla-Move
	new
	(vlax-3d-point ins)
	(vlax-3d-point (list (car p2) (cadr p2) (caddr ins)))
      )
      (vla-put-Layer new "BLOCS_PROJETES")
    )
 )
      )
      (vla-delete ss)
    )
 )
 (princ)
) 

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

Posté(e)

Merci Gile.

Ca marche du feu de Dieu

 

C'est exactement ce que je cherchais.

En effet, ca marche même dans le SCG donc pas besoin chaque fois de déplacer le SCU suivant l'objet polyligne.

 

Merci encore.

Chris_mtp.

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é