Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

 

J'ai fouillé un peu sans succès, vous m'excuserez si le sujet a déjà été traité.

Je cherche à sélectionner des segments de polylignes comme la méthode de sélection des commandes _trim _extend ou _dimangular.

 

Je me dis que quelqu'un a déjà dû plancher sur le sujet.

 

Sélectionner des sub-entités de bloc reste assez simple, mais des segmets de polyligne, je sèche.

Avez-vous des idées ?

 

Merci à vous.

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Coucou,

 

Cela dépend un peu de ce que tu souhaites faire... Les segments ne sont pas des entités à proprement parlé donc tu ne pourras pas par exemple créer un (ssget) avec les segments sélectionnés.

En revanche, si la liste des segments (chacun représenté par deux sommets qui se suivent) alors chat ne devrait pas poser de soucis :3

 

Que dois-tu faire de ces segments ? Une liste de coordonnées de points est-elle suffisante pour la suite de ton programme ?

 

Bisous,

Luna

Posté(e)

Par exemple cette fonction retourne les coordonnées du premier sommet du segment et du second sommet du segment (selon le sens de la polyligne). Il s'agit des coordonnées SCG et tu peux sélectionner ta polyligne aussi bien en SCG qu'en SCU.

La fonction à un argument pour choisir le message à afficher lors de la sélection de l'objet.

(defun SegSel (msg / pt dist entlist name)

(if (and
    	(setq entlist (entsel msg))
	(= (cdr (assoc 0 (entget (setq name (car entlist))))) "LWPOLYLINE")
	(setq pt (vlax-curve-getclosestpointto name (trans (cadr entlist) 1 0)))
	(setq dist (vlax-curve-getdistatpoint name pt))
	(setq entlist (entget name))
    )
	(progn
		(while (< (vlax-curve-getdistatpoint name (cdr (assoc 10 entlist))) dist)
			(setq pt (cdr (assoc 10 entlist))
			      entlist (cdr (member (assoc 10 entlist) entlist))
			)
		)
		(list pt (cdr (assoc 10 entlist)))
	)
	(princ)
)

)

 

Je ne sais pas si ça répond à ta demande, ni même si cela est exploitable dans la suite de ton programme (prise en compte de segments courbes, utilisation de polylignes 2D/3D, ...)

 

Bisous,

Luna

Posté(e)

Bonjour Luno, chat va ?

Merci pour ta réponse.

Oui, j'avais bien compris cette subtilité, mais le comportement de la sélection des commandes citées au-dessus montrent que c'est possible.

 

Je souhaite créer une commande similaire à _dimangular qui permettrait de donner l'angle "à enlever" de 2 lignes (ou segments, suivant les cas), comme le montre le schéma ci-dessous :

 

post-15884-0-78740000-1602579463_thumb.jpg

Vu qu'il s'agit de segments, je ne sais pas comment récupérer les infos en lisp si je passe par la commande _dimangular. Donc j'essaie de reproduire le comprtement de _dimangular.

Vois-tu ?

 

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Oki donc si je comprend bien, la commande _DIMANGULAR retourne l'angle en noir 67,7° et tu cherches toi à afficher la cotation rouge, n'est-ce pas ?

 

En ce cas, les coordonnées suffiront pour l'exercice mais comment détermines-tu si l'angle à compléter est un angle à 90°, 180° ou 270° ?

Tu peux regarder du côté de la fonction (angle) et l'utilisation des coordonnées des segments (issues du programme ci-dessus) pour calculer tes angles, après tu fais les calculs dont tu as besoin, mais chat me paraît parfaitement réalisable en coordonnées pures et en soustraction / addition d'angle (attention car les angles retournés sont en radian donc prévoir les conversions nécessaires au besoin) :3

 

Bisous,

Luna

Posté(e)

Si cela est trop "mathématique", il reste toujours la solution de créer deux lignes temporaires (par (command) ou par (entmake)) est d'utiliser ces lignes temporaires comme argument pour la commande _DIMANGULAR et ensuite de supprimer les lignes ni vu ni connu :3

 

C'est un moyen détourner mais il n'existe jamais qu'une seule solution à un problème :3 Moi j'ai plutôt tendance à chercher une solution mathématique (résolution d'équation cartésienne, produits scalaires, etc) mais chat n'est pas la méthode de tout le monde, donc le plus simple est de trouver ta propre méthode ^^

 

Bon courage,

Luna

  • 2 semaines après...
Posté(e)

Coucou,

 

As-tu réussi à avancer sur ton problème du coup ?

Si tu pourras poster ton code une fois terminé, cela pourrait servir pour d'autres personnes :3

 

Bisous,

Luna

Posté(e)

Chalut,

 

C'est encore en phase de test, j'ai pas encore géré les changements de SCU ni les angles obtus, et j'ai pas trop de temps à consacrer à la prog en ce moment !

Mais je peux te montrer le bout de code en l'état.

Dis moi ce que tu en penses !Bonne journée.

 

da.lsp

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Coucou,

 

Au besoin, j'ai pu me pencher un peu plus sur ton problème donc j'ai une solution (qui pourrait être améliorable) mais il me semble qu'elle fonctionne dans l'ensemble. Si tu désires avancer de ton côté, je ne la posterai pas mais si tu le souhaites je peux la poster.

J'ai en effet oublié que les segments pouvait également être issus de "LINE" simple mais il suffit de mettre à jour la fonction (SegSel) pour prendre en compte les lignes (un simple (if) sera suffisant pour passer outre la boucle).

 

Bisous,

Luna

  • 3 mois après...
Posté(e)

Ah zut désolé je n'avais pas vu ton dernier message !

Ben si tu as une solution autre, oui je veux bien voir ton code stp !

Merci !Matt.

 

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Coucou,

 

voici ce que j'avais fait à l'époque

(defun c:angdim (/ ref cmdecho pt-list-e1 pt-list-e2 name I a b c)
         
(defun get-midpoint (p1 p2)

	(polar p1 (angle p1 p2) (/ (distance p1 p2) 2.0))

)

(if (and
    	(setq ref (entsel "\nSélectionner une cotation de référence : "))
	(= (cdr (assoc 0 (entget (setq ref (car ref))))) "DIMENSION")
    )
	ref
	(setq ref nil)
)
(initget 2 "Aucun 90 180 270")
(if (setq c (getreal "\nVeuillez spécifier l'angle complémentaire [90/180/270] <Aucun> : "))
	(setq c (/ (* pi c) 180.0))
)
(setq cmdecho (getvar "CMDECHO"))
(while (if (and (setq pt-list-e1 (SegSel "\nVeuillez sélectionner la première polyligne : "))
	 	(setq pt-list-e2 (SegSel "\nVeuillez sélectionner la seconde polyligne : "))
		(setq I (get-intersection-from-segment pt-list-e1 pt-list-e2))
		(setq a (angle I (car pt-list-e1)))
		(setq b (angle I (car pt-list-e2)))
		(cond
			((and c
			      (< (- a B) (/ pi 2.0))
			      (> (- a B) 0)
			 )
				(setq pt-list-e1 (list (polar I (- a c) (distance I (car pt-list-e1)))
						       (polar I (- a c) (distance I (cadr pt-list-e1)))
						 )
				)
			)
			((and c
			      (< (- a B) pi)
			      (> (- a B) (/ pi 2.0))
			 )
				(setq pt-list-e1 (list (polar I (+ a c) (distance I (car pt-list-e1)))
						       (polar I (+ a c) (distance I (cadr pt-list-e1)))
						 )
				)
			)
			((and c
			      (< (- a B) (/ pi -2.0))
			      (> (- a B) (* -1 pi))
			 )
				(setq pt-list-e1 (list (polar I (- a c) (distance I (car pt-list-e1)))
						       (polar I (- a c) (distance I (cadr pt-list-e1)))
						 )
				)
			)
			((and c
			      (< (- a B) 0)
			      (> (- a B) (/ pi -2.0))
			 )
				(setq pt-list-e1 (list (polar I (+ a c) (distance I (car pt-list-e1)))
						       (polar I (+ a c) (distance I (cadr pt-list-e1)))
						 )
				)
			)
		)
	 	(setq name (entmakex	(list
						'(0 . "DIMENSION")
						'(100 . "AcDbEntity")
						'(8 . "0")
						'(100 . "AcDbDimension")
						(cons 10 (car pt-list-e1))
						(cons 11 '(0 0 0))
						'(70 . 34)
						'(71 . 5)
						'(100 . "AcDb2LineAngularDimension")
						(cons 13 (cadr pt-list-e2))
						(cons 14 (car pt-list-e2))
						(cons 15 (cadr pt-list-e1))
						(cons 16 (get-midpoint (get-midpoint (car pt-list-e1) (cadr pt-list-e1)) (get-midpoint (car pt-list-e2) (cadr pt-list-e2))))
						'(50 . 0.0)
					)
	 		  )
		)
	    )
		t
		nil
	)
	(if ref
		(progn
			(setvar "CMDECHO" 0)
			(command "_MATCHPROP" ref name "")
			(setvar "CMDECHO" cmdecho)
		)
	)
)
(princ)

)

(defun SegSel (msg / pt dist entlist name)

       (if (and
               (setq entlist (entsel msg))
               (= (cdr (assoc 0 (entget (setq name (car entlist))))) "LWPOLYLINE")
               (setq pt (vlax-curve-getclosestpointto name (trans (cadr entlist) 1 0)))
               (setq dist (vlax-curve-getdistatpoint name pt))
               (setq entlist (entget name))
           )
               (progn
				    (while (< (vlax-curve-getdistatpoint name (cdr (assoc 10 entlist))) dist)
				            (setq pt (cdr (assoc 10 entlist))
				                  entlist (cdr (member (assoc 10 entlist) entlist))
				            )
				    )
				    (list pt (cdr (assoc 10 entlist)))
               )
       )

)

(defun get-intersection-from-segment (seg1 seg2 / A B C D Xa Xb Xc Xd Ya Yb Yc Yd X Y)

(if (and (setq A (car seg1))
	 (setq B (cadr seg1))
	 (setq C (car seg2))
	 (setq D (cadr seg2))
	 (setq Xa (car A))
	 (setq Xb (car B))
	 (setq Xc (car C))
	 (setq Xd (car D))
	 (setq Ya (cadr A))
	 (setq Yb (cadr B))
	 (setq Yc (cadr C))
	 (setq Yd (cadr D))
    )
	(cond
		((= 0 (- (* (- Xb Xa) (- Yd Yc)) (* (- Yb Ya) (- Xd Xc))))
			(princ "\nLes deux segments sont colinéaires.")
			nil
		)
		(t
			(setq Y (/ (+ (* (- (* Yb Xa) (* Ya Xb)) (- Yd Yc)) (* (- (* Yd Xc) (* Yc Xd)) (- Ya Yb)))
				   (atof (rtos (+ (* (- Xb Xa) (- Yc Yd)) (* (- Xd Xc) (- Yb Ya)))))
				)
			      X (/ (+ (* Y (- Xa Xb)) (- (* Ya Xb) (* Yb Xa))) (atof (rtos (- Ya Yb))))
			)
			(list X Y)
		)
	)
)		

)

 

Bisous,

Luna

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é