Aller au contenu

Un LISP pour créer une polyligne qui représente un isolant ?


brunomu

Messages recommandés

Bonjour Forum !

 

Quand on fait des détails soignés, je trouve super galère de faire des isolants bien dessinés : les types de lignes fournis par Autodesk ont plein de défauts (isolant de largeur constante uniquement, petits bouts de ligne au bout du motif, aspect moche aux angles des polylignes, impossible de gérer proprement la fin du motif, motif « zigzag » non paramétrable, angles du type de ligne « batting » trop ouvert,…).

 

Pour contourner la difficulté, je dessine des polylignes en zigzag avec l’angle que je veux, mais c’est vite galère.

D’où l’idée de créer un LISP qui permettrait, en désignant les 2 extrémités d’un rectangle, la création automatique d’une polyligne en zigzag qui remplisse le rectangle.

 

Problème : je ne sais pas le faire en LISP !

Est-ce que les cracks du Forum pourraient m’aider ? (je pense que ça rendrait service à beaucoup de gens).

 

Deux améliorations possibles :

- pouvoir indiquer l’angle maxi entre 2 segments successifs

- plutôt que de saisir un rectangle, on pourrait saisir les 4 sommets d’un trapèze, car parfois l’isolant s’amincit

 

Par avance merci à celui/celle qui voudra bien s’y coller (à moins que ça n’existe déjà ?!

 

 

 

[Edité le 6/7/2010 par gloub]

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Problème : je ne sais pas le faire en LISP !

C'est le moment ou jamais de commencer

 

Est-ce que les cracks du Forum pourraient m’aider ? (je pense que ça rendrait service à beaucoup de gens).

Avec plaisir.

Si tu pouvais mettre une image à disposition pour bien comprendre ce que tu souhaites faire.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta réponse.

 

Voilà l'image :

 

http://yfrog.com/2pcrationisolantj

 

A l'étape 1, on saisit les contours du rectangle qui sera rempli d'isolant (rectangle plutôt allongé).

A l'étape 2 : le LISP crée une polyligne qui remplit parfaitement le rectangle

L'étape 3 n'est là que pour montrer le résultat sans le rectangle de saisie.

 

J'espère que ça explique clairement ce que j'imagine.

 

 

 

 

 

 

[Edité le 6/7/2010 par gloub]

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Donc 4 routines (c'est noël avant l'heure :D )

 

Isol qui fais ce que tu as demandé

Isold La même chose qu'Isol, mais en dynamique et avec la possibilité d'orienter le rectangle

Isolmin Pour indiquer l'angle mini

Isolmax Pour indiquer l'angle maxi

 

@+

 

[Edité le 8/7/2010 par Patrick_35]

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Waouh !

 

J'espérais une 2CV d’occasion et tu m’a livré une Rolls neuve ! Merci merci.

 

Bon, comme la Rolls est neuve, elle a besoin d’un petit rodage et d’un passage au garage.

J’ai de petits problèmes, que je ne sais pas résoudre (et vu la complexité des LISP, je vois bien que je n’aurais pas su les écrire tout seul…) :

- ISOL fonctionne seulement en SCG (UCS world), pour des rectangles horizontaux

- ISOLD fonctionne seulement en SCG. Ce serait plus simple si la commande marchait dans le SCU. Dans un SCU, la commande crée d’office un motif très (trop) long

- avec ISOLD, j’arrive à saisir précisément le 1er point du rectangle, mais pas le 2ème ; donc le motif d’isolant ne s’arrête pas exactement à un point précis

- ce serait peut-être mieux d’intégrer à la commande le choix des valeurs par défaut ISOLMIN et ISOLMAX (un peu comme dans la commande NUAGEREV / REVCLOUD)

 

Mais bon, c’est déjà super. Encore une fois : merci beaucoup !

 

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

J’ai de petits problèmes, que je ne sais pas résoudre (et vu la complexité des LISP, je vois bien que je n’aurais pas su les écrire tout seul…) :

Il faut bien se lancer un jour :D

Comment crois-tu qu'on y arrive ;)

Petit à petit, l'oiseau fait son nid et en plus, je pense que plus d'une personne sur ce site serait capable de t'aider

 

- ISOL fonctionne seulement en SCG (UCS world), pour des rectangles horizontaux

C'est corrigé, je me suis un peu mélangé les pinceaux.

 

- ISOLD fonctionne seulement en SCG. Ce serait plus simple si la commande marchait dans le SCU. Dans un SCU, la commande crée d’office un motif très (trop) long

Idem qu'avec ISOL

 

- avec ISOLD, j’arrive à saisir précisément le 1er point du rectangle, mais pas le 2ème ; donc le motif d’isolant ne s’arrête pas exactement à un point précis

MAintenant, pendant la saisie dynamique, un appuie sur tab permet de saisir un point (par accrobj ou coordonnées)

 

- ce serait peut-être mieux d’intégrer à la commande le choix des valeurs par défaut ISOLMIN et ISOLMAX (un peu comme dans la commande NUAGEREV / REVCLOUD)

J'ai fais un peu différemment. Pendant la saisie dynamique, avec les touches + et -, tu peux augmenter/diminuer l'angle maxi et mini.

Je conserve quand même les deux commandes qui déterminent les angles.

 

Donc, une nouvelle version.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

C'est génial, bravo et merci !

 

Je ne sais pas combien tu as passé de temps là-dessus (j'espère pas trop). Pour ce qui me concerne, ça va m'en faire gagner pas mal.

 

Quant à maîtriser AUTOLISP, j'ai essayé de m'y mettre, mais faute d'avoir trouvé un manuel compréhensible pour un – relativement – novice en programmation, je n'ai jamais réussi à "rentrer" dedans. Je me contente donc de bidouiller.

 

Si tu connais un bouquin ou un tutoriel sur internet, je suis preneur (encore que, comme je suis tout le temps charrette, il faudra que j'ingurgite le tout à mes heures perdues, càd pas grand-chose).

 

Merci encore.

Lien vers le commentaire
Partager sur d’autres sites

C'est génial, bravo et merci !

De rien

 

Je ne sais pas combien tu as passé de temps là-dessus (j'espère pas trop). Pour ce qui me concerne, ça va m'en faire gagner pas mal.

A peine une matinée

 

Quant à maîtriser AUTOLISP, j'ai essayé de m'y mettre, mais faute d'avoir trouvé un manuel compréhensible pour un – relativement – novice en programmation, je n'ai jamais réussi à "rentrer" dedans. Je me contente donc de bidouiller.

Il faut bien commencer un jour

 

Si tu connais un bouquin ou un tutoriel sur internet, je suis preneur (encore que, comme je suis tout le temps charrette, il faudra que j'ingurgite le tout à mes heures perdues, càd pas grand-chose).

Tu as l'aide, et surtout ce site

 

Merci encore.

C'est un plaisir, et ça m'a permis de jouer avec grread

 

Une nouvelle version, car les mouvements de la souris avec la saisie dynamique ne me convenaient pas vraiment

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Merci d'avoir poursuivi tes efforts.

 

Jusqu'ici j'ai utilisé ISOLD.

Je viens de faire un essai avec ISOL, mais ça ne marche pas, ou plutôt : ça marche dans le SCG, mais ça ne fait, au mieux, que créer la diagonale du rectangle, quelles que soient les valeurs d'ISOLMIN et/ou ISOLMAX.

 

Keskispass ?

 

 

PS : je ne connais pas grread, je sais encore moins jouer avec. Qu'est-ce qu'on gagne ? ;-)

Lien vers le commentaire
Partager sur d’autres sites

  • 7 mois après...

Bonjour à tous...

 

Je ne voudrais pas pinailler mais l'isolant se dessine plus souvent, et c'est plus "joli" comme une sorte de petit "serpentin", une sorte su "S" contigus...

 

J'ai une image exemple mais je n'arriva pas à la poster...

 

Et c'est infiniment plus complexe à dessiner...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Re

 

Merci Lili2006, je tente le truc...

 

Voici donc ma jolie image...

 

http://www.phalenecad.fr/CadXP/Isolant.jpg

 

Tada ! !C'est une coupe ( mais en plan, c'est la même symbolique d'un mur et de son doublade

 

De gauche à droite :

2cm de crépis, 20cm de parpaing, une couche de colle, 10cm d'isolant et le BA13...

 

Voilà qui est fait...

 

Le mieux est d'en faire un type de ligne pour pouvoir en faire une multiligne ( car l'isolant peut faire plusieurs épaisseurs 10, 12, 16, 18... Et il peut aussi être coupé pas la menuiserie...)

 

Et maintenant, je sais poster des images ! !

 

Et bon dimanche... Sous vos applaudissements...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

  • 9 ans après...

Hello

 

Routine sortie de mon stock de 3000 routines !

Testee et Validee sur AutoCAD 2021 ...

 

SVP tu testes la routine de notre REGRETTE Patrick_35 ci-dessous !

 

Et SVP tu nous diras, si elle est OK pour toi !?

Et si OK sur quelle version de AutoCAD, tu la fais tourner !?

 

LA SANTE (Stay Safe), Bye, lecrabe "triste"

Automne 2020, la retraite

 

 


;;
;; Routines Isolation par P35 -- Vers 1.20 15/07/2010
;; 
;; A utiliser avec le Type de Ligne ISOLATION ou Equivalent ... 
;;
;; ISOL / ISOLD : on tire en Dynamique les Coins d un Rectangle 
;; Et la Diagonale se dessine en consequence ...
;; 
;; https://cadxp.com/topic/28002-un-lisp-pour-creer-une-polyligne-qui-represente-un-isolant/
;; 
;; Donc 4 routines (c'est Noel avant l'heure :D )
;; 
;; Isol : qui fais ce que tu as demande
;; Isold : La meme chose qu'Isol, mais en dynamique et avec la possibilite d'orienter le rectangle
;; Isolmin : Pour indiquer l'angle mini
;; Isolmax : Pour indiquer l'angle maxi
;; 

(defun c:isold(/ ang bas deb dir dis ent fin lec lst nbr pol pt1 pt2 pt3 pt4 pt5 pt6 pt7 s sor tot
	*errisol* deg rad round)

 (defun *errisol* (msg)
   (or (member (strcase msg) '("FUNCTION CANCELLED" ""QUIT / EXIT ABORT"" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON"))
     (princ (strcat "\nErreur : " msg))
   )
   (setq *error* s)
   (and ent (entdel ent))
   (and pol (entdel pol))
   (princ)
 )

 (defun deg(ang)
   (* 180.0 (/ ang pi))
 )

 (defun rad (ang)
   (* pi (/ ang 180.0))
 )

 ; Arrondi de (gile)
 (defun round (num prec)
   (if (zerop (setq prec (abs prec)))
     num
     (* prec
(fix ((if (minusp num) - +) (/ num prec) 0.5))
     )
   )
 )

 (or angle_mini (setq angle_mini 30))
 (or angle_maxi (setq angle_maxi 40))


 (setq s *error*
*error* *errisol*
 )

 (and	(setq pt1 (getpoint "\n1er Point : "))
(setq pt4 (getpoint pt1 "\nSecond point : "))
 )
 (while (not sor)
   (setq lec (grread T 7 0))
   (cond
     ((equal lec '(2 9))
(setq pt5 (getpoint "\nSpecifier le point : "))
(setq lec (list 5 pt5)
      sor t
)
     )
     ((equal lec '(2 43))
(setq angle_mini (1+ angle_mini)
      angle_maxi (1+ angle_maxi)
      lec (grread T 1 0)
)
     )
     ((equal lec '(2 45))
(setq angle_mini (1- angle_mini)
      angle_maxi (1- angle_maxi)
      lec (grread T 1 0)
)
     )
     ((or (and (eq (car lec) 2)  (member (cadr lec) '(13 32)))
   (member (car lec) '(3 25))
)
(setq sor t)
     )
   )
   (and (eq (car lec) 5)
 (not (equal (cadr lec) pt1)) 
     (progn
(setq bas (angle pt1 pt4)
      dir (angle (polar pt1 bas (/ (distance pt1 pt4) 2)) (cadr lec))
)
(if (> bas pi)
  (setq deb (- bas pi)
	fin bas
  )
  (setq deb bas
	fin (+ bas pi)
  )
)
(and (> deb (* pi 2)) (setq deb (- (* pi 2) deb)))
(and (> fin (* pi 2)) (setq fin (- fin (* pi 2))))
(if (and (>= dir deb) (<= dir fin))
  (setq ang 90)
  (setq ang -90)
)
(and (> bas pi) (setq ang (- ang)))
(and ent (entdel ent))
(setq ent (entmakex (list (cons   0 "LWPOLYLINE")
			  (cons 100 "AcDbEntity")
			  (cons 100 "AcDbPolyline")
			  (cons  90 5)
			  (cons  10 (trans pt1 1 0))
			  (cons  10 (trans (setq pt2 (polar pt1 (rad (+ (deg bas) ang)) (distance pt1 (cadr lec)))) 1 0))
			  (cons  10 (trans (setq pt3 (polar pt2 bas (distance pt1 pt4))) 1 0))
			  (cons  10 (trans pt4 1 0))
			  (cons  10 (trans pt1 1 0))
		    )
	  )
)
(setq pt5 (inters pt4 pt3 pt1 (polar pt1 (rad (+ (deg bas) (- 90 (/ (+ angle_mini angle_maxi) 2)))) (distance pt1 pt4)) nil)
      nbr (round (/ (distance pt4 pt3) (distance pt4 pt5)) 1.0)
)
(and (zerop nbr)(setq nbr 1.0))
(setq dis (/ (distance pt4 pt3) nbr)
      tot dis
      bas nil
      lst (list (cons 10 (trans pt1 1 0)))
)
(while (<= tot (distance pt3 pt4))
  (if bas
    (setq pt6 pt1
	  pt7 pt2
	  bas nil
    )
    (setq pt6 pt4
	  pt7 pt3
	  bas T
    )
  )
  (setq lst (cons (cons 10 (trans (polar pt6 (angle pt6 pt7) tot) 1 0)) lst)
	tot (+ tot dis)
  )
)
(and pol (entdel pol))
(setq pol (entmakex (append (list (cons   0 "LWPOLYLINE")
				  (cons 100 "AcDbEntity")
				  (cons 100 "AcDbPolyline")
				  (cons  90 (length lst))
			    )
			    lst
		    )
	  )
)
     )
   )
 )
 (and ent (entdel ent))
 (setq *error* s)
 (princ)
)


(defun c:isol(/ bas dif dir lst nbr pt1 pt2 pt3 pt4 pt5 pt6 pt7 tot
	deg rad round)

 (defun deg(ang)
   (* 180.0 (/ ang pi))
 )

 (defun rad (ang)
   (* pi (/ ang 180.0))
 )

 ; Arrondi de (gile)
 (defun round (num prec)
   (if (zerop (setq prec (abs prec)))
     num
     (* prec
(fix ((if (minusp num) - +) (/ num prec) 0.5))
     )
   )
 )

 (or angle_mini (setq angle_mini 30))
 (or angle_maxi (setq angle_maxi 40))

 (and	(setq pt1 (getpoint "\nPremier coin : "))
(setq pt3 (getcorner pt1 "\nDeuxieme coin : "))
   (progn
(setq pt2 (list (car pt3) (cadr pt1) 0.0)
      pt4 (list (car pt1) (cadr pt3) 0.0)
)
(cond
  ((> (distance pt1 pt2) (distance pt2 pt3))
    (setq dif 0)
  )
  (T
    (setq dif 180
	  pt5 pt1
	  pt1 pt2
	  pt2 pt3
	  pt3 pt4
	  pt4 pt5
    )
  )
)
(setq pt5 (inters pt4 pt3 pt1 (polar pt1 (rad (+ (deg (angle pt1 pt2)) (/ (+ angle_mini angle_maxi) 2) dif)) (distance pt1 pt4)) nil)
      nbr (round (/ (distance pt4 pt3) (distance pt4 pt5)) 1.0)
)
(and (zerop nbr)(setq nbr 1.0))
(setq dis (/ (distance pt4 pt3) nbr)
      tot dis
      lst (list (cons 10 (trans pt1 1 0)))
)
(while (<= tot (distance pt3 pt4))
  (if bas
    (setq pt6 pt1
	  pt7 pt2
	  bas nil
    )
    (setq pt6 pt4
	  pt7 pt3
	  bas T
    )
  )
  (setq lst (cons (cons 10 (trans (polar pt6 (angle pt6 pt7) tot) 1 0)) lst)
	tot (+ tot dis)
  )
)
(entmakex (append (list (cons   0 "LWPOLYLINE")
			(cons 100 "AcDbEntity")
			(cons 100 "AcDbPolyline")
			(cons  90 (length lst))
		  )
		  lst
	  )
)
   )
 )
 (princ)
)


(defun c:isolmin(/ def rep)
 (initget 7)
 (if angle_mini
   (setq def (rtos angle_mini))
   (setq def "30")
 )
 (and (setq rep (getreal (strcat "\nAngle minimum <" def ">: ")))
   (setq angle_mini rep)
 )
 (princ)
)


(defun c:isolmax(/ def rep)
 (initget 7)
 (if angle_maxi
   (setq def (rtos angle_maxi))
   (setq def "40")
 )
 (and (setq rep (getreal (strcat "\nAngle maximum <" def ">: ")))
   (setq angle_maxi rep)
 )
 (princ) 
) 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Merci pour ces routines.

Cela fonctionne comme le souhaitait l'auteur de ce post. Je suis sur Autocad 2016.

Mais je pensais que cela créait une polyligne avec le motif de l'isolant,

Je me suis dit: si je mettais en pratique les explications sur DA-Code (il est super ce site, merci Didier) "bulge, vlax-curve"

mais en cherchant sur le net je suis tombé sur ce lien qui semble bien fonctionné

 

InsulBattPoly.zip

 

 

Merci lecrabe pour le partage des routines

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é