Aller au contenu

Création d'un programme éclairage public


mateus

Messages recommandés

Bonjour à tous et à toutes , je viens à vous car j'aurai besoin d'aide pour un projet que je dois réaliser dans le cadre d'un projet d'étude: le but est de créer automatiquement à l'aide d'un lisp, les réseaux d'éclairage public en indiquant quelques données au préalable. L'utilisateur devra rentrer donc quelques données, telles que l'entraxe entre les candélabres, la distance entre le bord de la chaussée et les candélabres puis la distance de décalage entre le réseaux ECP(éclairage public) et le candélabre. Sachant que le réseaux pourra figurer en dessous ou bien au dessus du candélabre ( vue en plan). Pour mieux comprendre je joins avec cette demande un imprime écran pour mieux comprendre avec, en vert le travail que le programme lisp devra réalisé. Si quelqu'un aurait une idée, merci beaucoup par avance :)

post-41726-0-27705800-1362776705_thumb.jpg

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

 

l'algo est assez simple:

- saisie des paramètres de décalage D1 et D2, puis de l'équistance E

- sélection de la polyligne bord de trottoir

- conversion en objet VLA pour pouvoir accéder aux fonctions valx-curve

- décalage de la poly bord de trottoir de la distance D1 (valeur négative=> décalage à gauche, valeur positive => décalage à droite)

(fonction Offsetcurve) => nouvelle polyligne PL1

 

- décalage de la poly PL1 de la distance D2 => nouvelle polyligne PL2

- boucle sur les abscisses le long de PL1

- calcul du point à la distance E à partir du début de la poly PL1 => point PT1 (fonction GetPointAtDist)

- calcul de la dérivée première (direction de la tangente ) au point PT1 (fonction GetFirstDeriv)

- insertion du lampadaire au point PL1 avec rotation = dérivée première (éventuellement ajouter ou retirer PI/2 selon la définition du bloc)

- calcul du point temporaire correspondant à la projection de PT1 sur la poly PL2 (fonction GetClosestPointTo)

- calcul de l'abscisse de ce point sur la poly PL2 (getDistAtParam) => abscisse PK

- pour calculer le V :

- calcul du point à PK - D2 sur la poly PL2 (getPointAtDist) => PT3

 

- calcul du point à PK + D2 sur la poly PL2 (getPointAtDist) => PT4

- insertion des points PT3 PT1 PT4 dans la poly PL2 pour dessiner le V entre les 2 sommets qui entoure la valeur du PK

- incrémenter l'abscisse de E (et boucler)

Olivier

  • Upvote 2
Lien vers le commentaire
Partager sur d’autres sites

coucou

 

 

 

je te rejoins dans ta façon d'expliquer la marche à suivre plutôt que de donner des lignes de programme.

 

maintenant avec la génération "internet" tu prends un risque car on ne sais pas comment cela va être reçu.

 

 

amicalement

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous et à toutes , j'ai trouvé une fonction qui me falicitera la vie pour insérer mes blocs candélabres qui est : "mesurer" . Avec cette commande mon algo sera beaucoup plus simplifié puisqu'il sera le suivant :

 

-Chargement du type de ligne "ECP" qui est dans un fichier existant type ".lin"

-création et chargement du calque d'éclaire public avec le type de ligne ECP

-Déclaration des variables : D1, D2 , et E : l'entraxe entre candélabre

-Décalage de la polyligne (bord de trottoir) de la distance D1 pour obtenir la nouvelle polyligne "PL2" qui sera le réseau ECP

-Commande mesurer sur la nouvelle polyligne PL2 pour obtenir les candélabres tout au long de cette polyligne "PL2"

 

Je n'ai pas encore fait le lisp car je suis déjà coincé au niveau de mon programme qui est juste ceci pour l'instant:

 

 

 

; Pgn Réseaux ECP

 

(defun c:ECPC ()

 

 

; définition des variables:

 

setq D1 (getdist"\n Donner la distance entre le bord de la chaussée et les candélabres : ")

setq D2 (getdist"\n Donner la distance de décalage entre les candélabres et le réseaux ECP : ")

setq E (getdist"\n Donner la distance entre les candélabres: ")

 

; insérer ici une commande pour joindre les polylignes

 

(command "-typeligne" "ch" "ECP" "réseaux" "" "o"); chargement du type de ligne ECP

(command "calque" "n" "ICI-RES-ECP" "co" "3" "" "tl" "ECP" "" "")

 

 

 

); fin du pgn

 

 

Ici mon problème est que cela coince au niveau de la création du calque et le type de ligne car ils peuvent être déjà existant.

 

Ma question est comment faire en sorte de dire à l'utilisateur : si le calque existe déjà ne rien faire et si le type de ligne existe déjà ne rien faire également.

 

 

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Bonjour

 

Ici mon problème est que cela coince au niveau de la création du calque et le type de ligne car ils peuvent être déjà existant.

 

Ma question est comment faire en sorte de dire à l'utilisateur : si le calque existe déjà ne rien faire et si le type de ligne existe déjà ne rien faire également.

 

Regarde la fonction lisp (tblsearch table-name symbol [setnext])

Si celle-ci te retourne autre chose que nil, ne rien faire, autrement créer la table.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour à tous, je reviens à vous car je suis coincé avec le pgn ECP, je suis bloqué avec la commande "mesurer" d'autocad" voilà je voudrai l'utiliser pour décaler mes candélabres après l'insertion du premier mais j'aimerai qu'à la place des invites de la commande "mesurer" on demande à l'utilisateur: sélectionner le réseaux ECP, enlever "spécifier la longueur du segment ou [bloc]" et y mettre directement le bloc à insérer etc. En vérité je voudrais complètement remanié les invites de commande de la fonction. Quelqu'un aurait t'il une idée? Ci-dessous je mets le lisp jusqu'à cette commande "mesurer"

 

 

 

(defun c:ECPC ()

 

(setvar "attdia" 0)

(setvar "cmdecho" 0)

(setvar "filedia" 0)

(setvar "osmode" 0)

 

(if (not (tblsearch "LTYPE" "ECP"))

(command "-typeligne" "ch" "ECP" "réseaux" "") ; Si le type de ligne n'est pas chargé, le charger, sinon ne rien faire

)

 

(command "-calque" "e" "ICI-RES-ECP" "co" "vert" "" "TL" "ECP" "" "");Chargement du calque ECP

 

 

;sélection de la ligne pour décalage

 

(setq L1 (entsel "\nSélectionner le bord de la chaussée qui va servir de base pour la création du réseau ECP: " ))

(setq NomEntite (CAR L1))

(setq Liste (entget NomEntite))

(setq D1 (getdist "\nDonner la distance de décalage entre le bord de la chaussée et le candélabre:"))

(command "decaler" D1 NomEntite (/ pi 2) "")

 

(setq ent (car (entsel "\nSélectionner la ligne qui a été décalée pour la mettre dans le calque ECP: ")))

(setq ent (entget ent));récupération de la ligne qui a été décalée

(setq ent (subst (cons 8 "ICI-RES-ECP") (assoc 8 ent) ent)); Remplacement du calque

(entmod ent); application du changement de calques

 

(command "-calque" "e" "ICI-RES-ECP-candelabre" "co" "vert" "" "TL" "CONTINUOUS" "" "") ;Création du calque candélabre

 

(setvar "osmode" 1)

(setq PtInsertion (getpoint "\nCliquez sur le point d'intertion du premier candélabre: ")); Choix du point d'insertion du bloc "candélabre"

(command "inserer" "candelabre" PtInsertion 1 1 0 "") ; insere le bloc candélabre

(command "calque" "e" 0 "") ;remet le calque 0 courant

 

(Command (prompt "Sélectionner le réseaux ECP pour créer les candélabres: "))

(command "mesurer" ent "bloc" "candelabre" "o" "3" ""); commande mesurer qui va permettre le décalage des candélabres

 

 

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

(setq dist (getdist"\n Donnez l'entraxe entre les candélabres? :"))

 

(setq ecp (car (entsel "\nSélectionner le réseaux ECP: ")))

(setq ecp1 (entget ecp));récupération des propriétés du réseaux ecp

(command "mesurer" (entlast) "bloc" "candelabre" "o" dist ""); commande mesurer qui va permettre le décalage des candélabres

 

 

J'ai modifié (ci-dessus) le lisp en essayant de mémoriser la ligne décalée pour utiliser la fonction "entlast" dans "mesurer" mais le pgn bloque lors de la commande mesurer et me dit :" L'objet ne peut pas être mesuré" ...

 

Est ce que quelqu'un pourrait m'aider please

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

Je ne sais pas si tu as modififié cette partie du programme, mais la dernière commande que tu utilise avant le mesurer c'est l'insertion du bloc candélabre (d'ailleur je ne sais pas pourquoi tu l'insère) le dernier objet est donc le bloc candélabre non mesurable.

Enregistre les entités dont tu as besoin au bon moment de ton programme. Pour la commande mesurer tu as déjà tous les paramètres sans être obligé de faire de nouvelle demande à l'utilisateur.

 

Je te donne juste des pistes pour que tu cherches par toi même.

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

C'est bon du coup le pgn fonctionne mais si j'ai choisis d'insérer le premier candélabre c'est parce que je désire que le premier soit entré par l'utilisateur et qu'après avec la commande "mesurer", le pgn place automatiquement les candélabres à la bonne interdistance mais à partir du premier, pour l'instant mon pgn fonctionne mais ne prend pas en compte le premier candélabre.

 

J'ai l'impression que le premier bloc inséré sur la polyligne empèche la fonction mesurer de fonctionner car lorsque j'enlève le premier bloc le pgn fonctionne correctement.

Lien vers le commentaire
Partager sur d’autres sites

La commande mesurer répartie les blocs sur la polyligne en partant du début pas d'un point choisit.

 

Modifie le point de départ. ;)

 

L'approche d'Olivier Eckmann donné en réponse #3 ne passe pas par les commandes Autocad ce qui t'éviteras d'être limité par elles.

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Voila je reviens à vous car je suis coincé au niveau de la création de mon bloc afin de l'utiliser par la suite avec la commande "mesurer"

 



(setq PtInsertion (getpoint "\nCliquez sur un côté du plan: "))
(command "inserer" "candelabre" PtInsertion 1 1 0 "") ; insere le bloc candélabre

;récupération des coordonnées de la poly réseau
(setq reseau(entget nreseau))
(setq rx(cadr(assoc 10 reseau)));récupération du x
(setq ry(caddr(assoc 10 reseau)));récupération du y
(setq rxy(cdr(assoc 10 reseau)));récupération du x et y

;récupération des coordonnées de la poly candélabre
(setq cande(entget ncande))
(setq cx(cadr(assoc 10 cande)));récupération du x
(setq cy(caddr(assoc 10 cande)));récupération du y
(setq cxy(cdr(assoc 10 cande)));récupération du x et y



 
 
;obtention de la distance réseau/candélabre et début du tracé de l'antène candélabre
(setq dcr (distance (list cx cy) (list rx ry)))

 
(setq angdcr (sqrt (+(* dcr dcr )(* dcr dcr))))
(setq pg (polar PtInsertion (* (/ pi 4) 3) angdcr))
(setq pd (polar PtInsertion (/ pi 4) angdcr))
(command "polylign" ptInsertion pg "")
(setq antgauche (entlast))
(command "polylign" ptInsertion pd "")
(setq antdroite (entlast))

(command "_block" candelabre antgauche antdroite "")

; c'est ICI que je suis coincé, il n'y a aucunes erreurs qui s'affichent, pourtant mes deux antennes de raccordement ainsi que mon premier block "candelabre" n'ont pas été redéfini en block comme je le voulais

 

 

 

Merci d'avance :unsure:

post-41726-0-05790900-1365535596_thumb.png

Lien vers le commentaire
Partager sur d’autres sites

c'est bon j'ai réussi à créer mon bloc avec mes deux antennes pour les raccorder au réseau, mon programme est quasi terminé mais j'aimerai le finaliser en:

 

-ajuster le réseau avec ses antennes

-créer des raccords en arc entre le réseau et les antennes

-Finir par joindre tous les éléments de la polyligne (antennes + réseau)

 

Ci-joint, l'imprim écran de que mon programme fait pour le moment et ce que j'aimerai y faire pour le finir.

 

 

Tout d'abord pour sélectionner tous mes candélabres j'ai trouvé sur un site ceci:

 

;;; Sélectionnez le bloc nommé "GGG" de la table des blocs: 
 (Tblsearch «BLOC» «GGG») 

 ;;; Sélectionnez tous les blocs nommés «GGG» à partir du dessin 
 (Ssget "_X" '((0. "INSERT") (2. "GGG"))) 

 ;;; Demander à l'utilisateur de faire un choix, mais seulement inclure des blocs appelés "GGG" 
 (Ssget '((0. "INSERT") (2. "GGG"))) 

 

 

 

Je pense que je vais l'utiliser pour sélectionner tous mes blocs et réaliser mes commandes

mais je ne sais pas comment faire pour utiliser les commandes "exploser" "ajuster" et "raccordement"

 

Quelqu'un aurait t-il une solution?

 

 

Merci :)

 

 

Et encore bravo pour le site, sans lui je n'avancerai pas ;)

post-41726-0-31662100-1365852117_thumb.png

Lien vers le commentaire
Partager sur d’autres sites

Bon j'ai laissé tombé avec la commande et j'ai utilisé ssget que j'ai souvent vu sur des posts, elle marche très bien sauf que je n'arrive toujours pas à utiliser la commande "xplode" qui n'est pas reconnu par autocad, certains conseille d'utiliser les fonctions d'expresstools mais étant donnée que j'ai autocad 2009 c'est pas possible il me semble donc comment puis-je faire pour exploser tous mes blocs ? Merci :)

Lien vers le commentaire
Partager sur d’autres sites

Après deux heures de recherches j'ai enfin réussi à sélectionner tous mes blocs et les exploser, il y a une histoire avec la variable "qaflags" qui m’empêchais de les exploser tous à la fois donc j'ai utilisé ce bout de code que j'ai trouvé sur un forum en anglais, je n'ai pas chercher à en comprendre plus, cette variable à l'air assez mystérieuse... :huh:

 

 

(setq recupbloc (ssget "_X" (list (cons 0 "INSERT") (cons 2 "candélabre"))))
(Setvar "qaflags" 1)
(command "_explode" recupbloc "")
(Setvar "qaflags" 2) 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Tu as choisi dès le départ de construire ton programme en utilisant (command), bien que cela soit plus facile au départ pour faire certaine choses simples, on se heurte lorsqu'on veut améliorer son programme à certaine difficultés, surtout avec des commandes d'édition tel que Coupure Ajuster Prolonger Raccord Chamfrein.

 

En effet ces commandes ont besoin d'un point sélection pour réaliser la commande correctement selon nos désirs et c'est là que les choses se complique pour le réaliser en programmation.

Ce n'est pas infaisable mais la suggestion de départ d'utiliser les fonctions (vlax-curve-xxxx) aurait été au bout du compte beaucoup plus simple pour faire ce que tu désire.

 

Si tu veux continuer avec (command) il te faut fournir une variable sous forme de liste comme celle que te retourne la fonction (entsel): donc une liste (<nom de entité> (point de sélection))

 

Avec cette méthode cela fonctionne bien SI tes entités sont affichées entièrement à l'écran et si on gère bien les SCU si ceux-ci sont utilisés.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Tout d'abord merci Bonuscad pour ta réponse et désolé pour ma réponse tardive, je comprends tout à fait l'intérêt que vous apportez vous les programmeurs à ces fonctions pour programmer en lisp, elles apportent certainement comme tu dis plus de facilités et plus de possibilités au programmeur pour arriver à ses fins. J'aimerai sincèrement finir mon petit programme car j'en aurait encore d'autres à faire après mais je suis bel et bien coincé à ce niveau de détails comme tu dis Bonuscad...

 

Je n'ai pas d'importance quant au choix que je dois prendre pour poursuivre mon programme (poursuivre avec les commandes ou bien avec les fonctions Vla, mais il est vrai que je souhaiterai sincèrement qu'on m'éclaircisse d'avantage pour que je finisse et aussi pour que je progresse)

 

Si je continue avec les commandes autocad, tu me dis, Bonuscad, de procéder avec des variables qui sont des listes d'entités mais pour moi, arrêtes moi si je me trompes, je pense que les entités que je souhaite ajuster sont dans des variables sous forme de liste ("antgauche", "antdroite" et "candélabre") non? Je les ai obtenue avec (entlast) ça fonctionne ?

 



(setq PtInsertion (getpoint "\nCliquez sur un côté du plan: "))
(command "inserer" "candelabre" PtInsertion 1 1 0 "") ; insere le bloc candélabre
(setq ename_bloc (entlast))

(setq angdcr (sqrt (+(* dcr dcr )(* dcr dcr))))
(setq pg (polar PtInsertion (* (/ pi 4) 3) angdcr))
(setq pd (polar PtInsertion (/ pi 4) angdcr))
(command "polylign" ptInsertion pg "")
(setq antgauche (entlast))
(command "polylign" ptInsertion pd "")
(setq antdroite (entlast))

 

Sinon pourrais tu m'en dire plus Bonuscad si je procède avec les fonctions Vla, savoir qu'elle démarche je dois suivre?

 

Merci beaucoup :)

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir Mogo,

Comme là précisé bonuscad, tu ne pourras pas contrôler le résultat uniquement avec des entités. La commande ajustement ne demande pas seulement une entité mais aussi un point de sélection qui a une influence sur son comportement.

Pour cela tu devras avoir une variable dont la forme ressemblera au résultat de la fonction entsel.

Obtenir cela dépasse mes connaissances en lisp je ne pense donc pas que je pourrais continué à t'aider sur ce programme.

 

Olivier

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é