Aller au contenu

Presque rectangle


Messages recommandés

Posté(e)

Bonjour,

 

Je dois nettoyer des plans de leurs polylignes presque rectangle

 

voir exemple ci-joint

 

http://dl.free.fr/pAvbqqACz

 

J'ai essayer avec ce code

 

 
(defun c:delpolrec (/ pol ListSom p1 p2 p3 p4 d1 d2 d3 d4)

(setq 	spol 	(ssget "x" (list (cons 0 "LWPOLYLINE") (cons 90 5)))    
		i 		0
) 
(if spol (progn
                                                      
	(repeat (sslength spol)

	(setq 	pol 	(ssname spol (1+ i))

		ListSom        (listSomPol pol)
					
		p1 	(car ListSom)
		p2 	(cadr ListSom)
		p3 	(caddr ListSom)
		p4 	(cadddr ListSom)
					
		d1	(fix(distance p1 p2))		
		d2	(fix(distance p2 p3))		
		d3	(fix(distance p3 p4))		
		d4	(fix (distance p4 p1))
	)
	(if (or(= d1 d3) (= d2 d4))(command "_erase"  pol ""))
                      )
)
)
)
;; Liste les sommets de la LWPOLYLIGNE (code cadxp)
(defun listSomPol ( pol / x)
	   (mapcar 'cdr
	   (vl-remove-if-not
	     '(lambda (x) (= (car x) 10))
	     (entget pol)
	   ) 
   )
)

 

Malheureusement il ne fonctionne qu'une fois avant de me mettre l'erreur

 

; erreur: type d'argument incorrect: point 2D/3D: nil :casstet:

 

comprend pas pourquoi ???? (peut etre parcequ'il y a cinq sommets dont 2 egaux)

 

et n'y aurait il pas une autre façon d'y arrivé (sans compter le nombre de sommets) ?

car il y a quelques cas ou les presque rectangles on un ou deux sommets supplementaires sur leur grand coté.

 

Merci

 

 

 

Posté(e)

Malheureusement il ne fonctionne qu'une fois avant de me mettre l'erreur

 

c'est normal, puisque la variable I n'évolue pas dans la boucle repeat.

 

Dans cette ligne de code :

(setq 	pol 	(ssname spol (1+ i))

 

I vaut toujours 0, donc (ssname spol (1+ i)) pointera toujours sur le 2ème élément du jeu de sélection. S'il ce 2ème élément a été effacé à la première itération par la commande ERASE qu'on trouve un peu plus loin dans le code, ça va forcément se planter puisque (ssname splo (1+ i) pointera vers une entité effacée.

 

Il faut donc écrite

 

(setq
pol (ssname spol i)
i (+1 i)
...
...
) 

 

afin de prendre tour à tour chaque élément de spol

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

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é