Aller au contenu

Problème gisement + Abscisse sur une droite


Messages recommandés

Posté(e)

Bonjour Didier ! pas de problème j'accepte complètement les critiques, elles sont là pour me faire avancer , c'est comme ça que je le prend en tout cas. Et puis face à des gens comme vous qui ont l'habitude de programmer et qui ont de l'expérience, on ne peut qu'en tirer profit.

 

Pour l'instant j'essaie de faire mon programme , qu'il fonctionne dans un premier temps et après je m'occuperai de l'optimiser et de le rendre plus simple si possible.

 

J'ai également une question car j'ai du mal avec l'incrémentation et j'en ai besoin pour la partie que je traite. Je souhaite boucler le long de ma droite l'insertion des blocks mais je suis coincé :

 

 


(defun CALCULPOINT (PX PY module orient distDroite / pt)

 (setq	pt(list PX PY))			;premier luminaire
 (setq lst_pt (list pt)); première liste avec le premier luminaire
 	(while(< module distDroite)
  (setq pt(polar pt orient module))
	(setq lst_pt(cons pt lst_pt)
  )
 
       )


)

 

Avec pt la première insertion du bloc

Ensuite je crée une liste avec ce premier point

Je dis au programme tant que l'entraxe entre les deux points n'est pas plus grand que la distance de la droite alors :

on redéfini le "pt" avec (polar)

Et je redéfini la liste des points en ajoutant à chaque fois le dernier point jusqu'à ce que la boucle retourne nil

 

Merci bien

  • Réponses 103
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Meilleurs contributeurs dans ce sujet

Images postées

Posté(e)

j'ai un soucis avec ma fenêtre d'espion qui ne s'affiche plus avec l'Autocad du boulot mais il me semble que mon code fonctionne comme ça :

 


(defun CALCULPOINT
	   (PX		  PY		orient
	    distDroite	  /		pt
	    pt_start	  increment_dist
	    entraxeCandelabre
	   )
 (setq pt_start (list PX PY));premier luminaire
 (setq	entraxeCandelabre
 (getdist pt_start
	  "\n Indiquez l'entraxe des candélabres "
 )
entraxeCandelabre
 (/ entraxeCandelabre (cos orient))

increment_dist
 entraxeCandelabre
lst_pt (list pt_start)	; première liste avec le premier luminaire

 )



			
 (while (< increment_dist distDroite)

  (setq increment_dist (+ increment_dist entraxeCandelabre))
   (setq pt (polar pt_start orient increment_dist))
   (setq lst_pt	 (cons pt lst_pt))
   	

   )

 )


 

Je vais vérifier ce soir avec mon pc.

 

 

Bonne journée

Posté(e)

Bonjour à tous, j'ai un soucis avec le bouclage des blocs. En fait ils s'incrément bien le long de la droite mais ils dépassent la droite. Je souhaiterai que les blocs s'incrément jusqu'à la fin de la droite.

 

En pièce jointe l'imprime écran

 

Et voici le code:

 



 (setq	pt_start (list (car projectionCandelabre)(cadr projectionCandelabre)))					;premier luminaire
 (setq entraxeCandelabre(getdist pt_start"\n Indiquez l'entraxe des candélabres ")
   entraxeCandelabre(/ entraxeCandelabre (cos orient))
 )
   
   (cond
     ((> distDroite entraxeCandelabre)
      (setq lst_pt(list pt_start); première liste avec le premier luminaire
      increment_dist entraxeCandelabre
      )
     
     (while
      (< increment_dist distDroite)
      (setq increment_dist (+ increment_dist entraxeCandelabre))
      (setq pt (polar pt_start orient increment_dist))
      (command "inserer" "assistant" pt 1 1 100 "")
      (setq lst_pt (cons pt lst_pt))

     )

   )
(T(princ"\nL'entraxe de vos candélabres est trop grande pour la droite !"))
 )
)

 

 

Avec pt_start : la première insertion

entraxeCandelabre: la distance entre deux blocs

disDroite: la distance totale

 

 

Merci

Posté(e)

Bonjour,

il ne faut pas incrémenter sur la distance totale de la droite, mais sur cette distance à laquelle on soustrait abscisse du 1er candélabre.

 

Si ta droite fait 100m et que tu poses le 1er candélabre à 35m du début, i ne faut incrémenter que de 100-35 soit 65m sinon ça dépasse.

 

Olivier

Posté(e)

Bonjour Olivier et merci pour ta réponse je vais rectifier ça dès ce soir. Je me disais bien qu'il y avait une erreur par rapport au premier candélabre.

 

Bonne journée :)

Posté(e)

Gile j'avais pas vu ta réponse du post 23 mais ça fait plaisir d'apprendre ce qu'est un modulo car grâce à toi je sais ce qu'il en ai après cette petite recherche.

 

Bonne soirée !

Posté(e)

Merci Olivier ça marche l'incrémentation se fait bien maintenant. Je souhaiterai désormais changer de couleur des deux entités qui composent mon bloc (avant la création du block "assistant"). Je rentre dans l'entité et je m’aperçois qu'il n'y a pas le code "DXF 62" correspondant à la couleur alors je voudrais le rajouter et y mettre le code appartenant à une couleur. Comment faire?

 

Merci

 

 


(defun c:essai ()

(setq pt1 (getpoint"\n premier point "))
(setq pt2 (getpoint"\n deuxième point "))

(command "polylign" pt1 pt2 "")
(setq entCouleur (entget(entlast)))

;là je pensais utilisr "cons" et y rajouter le code DXF 62 mais je bloque






)


 

 

Merci

post-41726-0-62985900-1374652901_thumb.png

Posté(e)

Ok j'ai compris pourquoi le code DXF correspondant à la couleur n’apparaît pas. C'est parce qu'elle est par défaut au noir.

 

J'aimerai quand même pouvoir changer la couleur ex:

 

 


(defun c:essai ()

 (setq pt1 (getpoint "\n premier point "))
 (setq pt2 (getpoint "\n deuxième point "))

 (command "polylign" pt1 pt2 "")
 (setq entCouleur (entget (entlast)))
 (subst '(62 . 2) '(62.1) entCouleur)

)

 

Ci-dessus un essai pour changer la couleur de ma polyligne en jaune alors qu'elle était en rouge au départ. Je n'arrive pas à la remplacer avec "subst"

 

Ensuite je souhaiterai pouvoir dire au pgn : changer la couleur de l'entité en jaune par exemple peut importe la couleur de l'entité ( si elle est en noir ou déjà en jaune )

 

 

Quelqu'un aurait-il une idée? Merci

Posté(e)

Salut,

 

Lors de la création d'une nouvelle entité sa couleur par défaut est ByLayer (256) et non pas noir, et elle n'est pas ajoutée à la liste DXF de l'entité (d'où son absence).

 

Donc, pour forcer la couleur d'une entité à une couleur de l'index, il faut tester si le groupe 62 existe ou pas dans la liste.

Si le groupe n'existe pas, il faut l'ajouter, de préférence avec appendpour l'ajouter en fin de liste.

Si le groupe existe, il faut le remplacer avec subst en supprimant au besoin les groupes 420 (couleurs vraies) et 430 (carnet de couleurs).

 

Une petite fonction pour attribuer une couleur de l'index à une entité.

 

;; SetColorIndex
;; Attribue la couleur de l'index à l'entité
;;
;; Arguments
;; dxfList    : la liste DXF de l'entité telle que retournée par entget
;; colorIndex : l'index de la couleur (entier entre 0 et 256)

(defun SetColorIndex (dxfList colorIndex)
 (entmod
   (if	(assoc 62 dxfList)
     (subst (cons 62 colorIndex)
     (assoc 62 dxfList)
     (vl-remove-if '(lambda (pair) (member (car pair) '(420 430))) dxfList)
     )
     (append dxfList (list (cons 62 colorIndex)))
   )
 )
)

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

Posté(e)

Merci beaucoup Gile même si j'ai encore du mal avec ces fonctions : mapcar/lambda j'ai compris l'essentiel !

 

Bonne soirée et merci encore pour l'explication

Posté(e)

Bonjour à tous ,

 

J'aurai juste une question parce que je m'interroge sur la définition de prédicat j'ai regardé sur le net mais je ne comprends pas tellement la définition du terme. Est ce que quelqu'un pourrait m'expliquer grossièrement et simplement ce que c'est?

 

Merci

Posté(e)

Salut,

 

En programmation, on appelle prédicat une fonction qui retourne une valeur booléen, soit vrai ou faux.

 

minusp, listp, zerop, etc. sont des fonctions prédicat (c'est ce que signifie le "p" à la fin), mais les opérateurs logiques and, or, not, ou les opérateurs d'égalité et d'inégalité eq, equal, =, /=,

 

En LISP, les valeurs booléennes pour vrai et faux sont respectivement T et nil, mais la plupart des fonctions utilisant un prédicat (if, cond, while, etc) considèrent tout résultat non nil comme vrai.

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

Posté(e)

Bonjour tout le monde, voilà j'ai un problème pour récupérer toutes mes "droites1" sur le prolongement de mon réseau

 

Au début mon programme implante tous les blocs d'assistance le long de la droite(voir image ci-jointe "ASSISTANCE" (le code concernant cette partie n'est pas joint). Ensuite le bout de code ci-dessous demande à l'utilisateur de quel côté veut t'il décaler ses candélabres. J'en suis à cette étape là. Je m'occupe pour l'instant au cas ou l'utilisateur répondra par "rouge" (donc décalage en haut de la droite).

 

Je souhaiterai récupérer toutes mes "droites1" ( image ci-jointe : "droite1") et les mettre dans une variable pour garder en mémoire tous les noms d'entités de ces dernières.

 

 

Je mets aussi l'image "Schéma" pour mieux se rendre compte.

 

 

 

 

 

 

 

 

 

 

 

(defun DECAL_CANDE (/ rep n pt3)

 ;;rappel : rouge : en haut
 ;;  	   Bleu  : en bas
 ;;decalageCandelabre: distance de décalage
 ;; lst_pt : liste des points d'insertions des blocs et aussi des droites
 ;; orient : l'angle de rotation
 ;; pt3 les points perpendiculaires aux points d'insertions des droites 




 (initget "Rouge Bleu")

 (setq	rep
 (getkword
   "\n De quel côté voulez vous placer vos candélabres? [Rouge/Bleu] <Rouge> : "
 )
 )
 (if (or (eq rep "Rouge") (eq rep "R") (eq rep ""))

   (progn
				;tracé du côté rouge
     (foreach n lst_pt
(setq pt3 (polar n (+ orient (/ pi 2)) decalageCandelabre))

(command "polylign" n pt3 "")
         (setq lst_droite1 (list(entlast)))  ; J'ESSAIE ICI DE RECUPERER LES ENTITES MAIS SEULEMENT LA DERNIERE DROITE IMPLANTEE EST ENREGISTREE
     )
   )
   (princ "Bleu" ; en attendant le reste du programme)
 )

 (setq jsBlock (ssget "_A" (list '(0 . "INSERT") '(2 . "assistant"))))
 (command "_erase" jsBlock "")

)

 

 

Merci par avance

post-41726-0-57917400-1374931753_thumb.jpg

post-41726-0-58064400-1374931757_thumb.jpg

post-41726-0-79153300-1374931759_thumb.jpg

Posté(e)

coucou

 

voici un bon moment que tu nous parle de tes soucis, c'est le week-end je suis moins tendu au niveau du temps et je viens regarder tes messages

s'il te plaît :

fais une description précise et détaillée de ce que tu veux obtenir, il y a plusieurs solutions à un problème unique

alors

1 : qu'est-ce qu'on a comme point de départ (des polylignes, des points ...)

2 : qu'est-ce que tu veux obtenir (des blocs insérés avec une équidistance, quels blocs ? fournis un bloc ou sa description)

parce que j'ai regardé et je vois des lignes et des lignes mais je ne comprends pas.

 

amicalement

Posté(e)

Bonsoir Didier et merci pour ta réponse, en fait voilà je veux tracer mon réseau avec mes luminaires (blocs) espacés à une distance rentrée par l'utilisateur, ci-joint un imprim écran avec en haut ce que mon programme fait jusqu'à présent et en bas ce que je voudrais qu'il fasse. Je suis coincé pour récupérer les entités de mes droites qui composent le piquage des luminaires au réseau principal. une fois que je l'ai aurait récupérer je pourrai finaliser ce programme en ajustant avec raccord et effaçant les droites qui ne seront pas conservées.

 

Merci bien en tout cas

Posté(e)

Au niveau des blocs j'ai un dossier ou je range 3 ou 4 blocs et j'aimerai pourquoi pas que l'utilisateur choisisse mais j'aimerai déjà régler mon problème de récupérations des entités ...

 

Merci :)

Posté(e)

Bonsoir à tous , voilà je suis toujours coincé pour récupérer mes entités (jonctions des candélabres au réseau d'éclairage) pour ce faire je viens de revoir tout mon pgn en terme de commentaires, essayé d'expliqué au mieux ce que j'ai essayé de faire dans ce dernier.

 

Je joins ce lisp en espérant que quelqu'un pourra m'aider à récupérer le noms de toutes mes entités

 

Ps: Je sais que mon programme est loin d'être parfait, je suis loin d'être au stade de la perfection , c'est un projet d'étude qui doit bientôt se terminer. Je souhaiter garder mon programme tel qu'il est et essayé de trouver des solutions aux problèmes que je rencontrerai jusqu'à la fin de ce programme sans toucher les fonctions ou commandes que j'ai fait avant.

 

 

Merci de bien comprendre ma démarche.

 

Bonne soirée à tous

 

Amicalement

Commandes_v0.1.1.LSP

Posté(e)

Bonjour,

 

Est ce que quelqu'un pourrait me dire comment récupérer mes entités et ce à chaque jonction (fonction n°8) de mon programme joint en post #46, c'est important je dois rendre mon projet d'étude dans un mois et il faut que je puisse résoudre cela avant de poursuivre.

 

Merci bien

 

Amicalement

Posté(e)

Coucou

Merci de bien comprendre ma démarche.

c'est de l'humour...

la semaine est repartie et la production passe avant tout donc moins de temps à te consacrer.

 

tu as le mérite de t'accrocher, c'est très bien.

tu as le défaut de garder des explications dans ta tête

dis-nous ce que tu veux dire par

comment récupérer mes entités

j'ai lancé le programme mais comme tu n'as pas donné de bloc candélabre j'en ai fait un bidon et je ne comprends pas toutes les questions

la première ligne définit quoi ? "sélectionner le premier point de votre alignement"

ensuite le décalage par rapport à la ligne, c'est quoi ? valeur de décalage du réseau

le côté du réseau ???

ensuite tu demandes : "cliquez sur le premier candélabre" ??? il y en a un d'inséré ??

ensuite tu demandes : "Indiquez le décalage des candélabres" c'est un décalage par rapport à quoi ? à moins que ce soit un entre-axe.

ah ben non tu le demandes maintenant l'entre-axes. et ainsi de suite ...

 

je te propose de nous faire un dessin autocad avec les différents stade d'évolution et le déposer

pour mémoire, fais un zip ou un pdf car le site n'accepte pas les dwg en pièce jointe ce qui est un comble avouons-le.

 

amicalement

 

 

Posté(e)

Bonjour Didier :

 

Merci encore pour ta réponse malgré le temps que tu n'as pas forcément.

 

tu as le mérite de t'accrocher, c'est très bien.
En fait j'ai pas le choix j'ai mis tellement de temps à me mettre à programmer car j'ai bloqué complètement dessus.

 

tu as le défaut de garder des explications dans ta tête
c'est pas faux, mais c'est que je vois que le temps avance et qu'il ne me reste plus beaucoup de temps car mon projet est loin d'être fini encore.

 

 

sélectionner le premier point de votre alignement"
j'ai décidé de dire à l'utilisateur de cliquer sur deux points pour que je me base sur celui-ci pour implanter la suite de mon programme (car plus facile, je connais déjà les deux sommets de la polyligne)

 

 

 

ensuite le décalage par rapport à la ligne, c'est quoi ? valeur de décalage du réseau
Le décalage par rapport à l'alignement est le réseau principal d'éclairage donc c'est sa distance de décalage que je demande.

 

 

le côté du réseau ???
Le côté du réseau comme tu pourras le voir sur les pdf , c'est le côté du réseau principal que l'utilisateur aura choisit pour implanter ses luminaires(candélabres)

 

 

"cliquez sur le premier candélabre" ??? il y en a un d'inséré ?? Non, bien vu, il n'y en a pas encore c'est une erreur de faute de français.

 

 

 

ensuite tu demandes : "Indiquez le décalage des candélabres" c'est un décalage par rapport à quoi ? à moins que ce soit un entre-axe.
Ici le décalage des candélabres c'est celui qui part du réseau principal d'éclairage jusqu'aux points d'insertions des candélabres. (la distance des blocs "assistants" de part et d'autre du réseau est égale à ce décalage)

 

 

Je te joins à ce #post, 4 pdf qui contiennent les explications graphiques de ce que je souhaite faire avec le programme.

 

Mes 3 problèmes actuellement sont: (en dehors de la mise en forme, optimisation du code, car je n'ai malheureusement plus le temps de retoucher le programme tel qu'il est défini désormais, je souhaite juste débloquer les derniers points )

 

- L'orientation des candélabres qui n'en fait qu'à sa tête, je ne comprends pas pourquoi ils s'orientent mal

- Le fait de devoir cliquer à chaque fois sur la souris pour faire apparaitre les piquages des candélabres (je ne sais pas si cela te le fais aussi avec ton post mais avec 2 ordi essayés, l'erreur y est encore.)

- Récupérer mes entités de polylignes sous forme de liste pour pouvoir joindre et raccord avec rayon sur le réseau principal.

 

 

 

Merci beaucoup pour l'aide

 

Amicalement.

Explications phase 1-2.pdf

Explications phase 3-4.pdf

Explications phase 5.pdf

Explications_details_entitees.pdf

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é