Aller au contenu

Bloc sur parcour


Invité ingoenius

Messages recommandés

Invité ingoenius
Posté(e)

Salut, je cherche a faire fonctionner un lisp, mais j'ai des problemes, le but est d'insere un nombre de blocs sur un parcours, ligne poliligne etc

 

si le parcour est une ligne ca fonctionne, car avec la commande _divide plus l'insertion du bloc en debut et en fin de ligne tout est ok, par contre si le parcours est un poliligne, j'arrive pas a extraire les coord de debut et de fin de poliligne pour inserer le fameus bloc

 

ici bon affreux debut de code ;-(

 

(defun C:PB ();path Block
(setq EL (car (entsel "\nSelect Path")));selectionne le parcour
(setq DTIPO (entget EL))
(setq IN (cdr (assoc 10 DTIPO)));debut de ligne
(setq OUT (cdr (assoc 11 DTIPO)));fin deligne
(setq ENT (cdr (assoc -1 DTIPO)));nom entité dans le dessin

         

(setq BLOCCO (car (entsel "\nSelect 1 block ")));block a cliquer dans le dessin
(setq DatiB (entget BLOCCO))			
(setq NBLOC (cdr (assoc 2 DatiB)))
(setq N (getreal "\nInsert Number of blocks\n"))		
(setq NDiv (fix (- N 1)))  
(command "_divide" ENT "B"  NBLOC "_Y" NDiv "")
(command "_-insert" NBLOC IN  "" "" "")   

)


 

[Edité le 19/9/2008 par ingoenius]

Posté(e)

Tiens :

 

pour une polyligne,

(mapcar 'cdr(vl-remove-if-not '(lambda(x)(=(car x)10))(entget EL)))

 

Donne tous les points très facilement.

 

Mais la question est : mon programme sait-il qu'il à affaire à une polyligne ?

 

(setq N (getreal "\nInsert Number of blocks\n"))

 

N'oublie pas que tu veux un ENTIER pas un REEL, donc GETINT !

 

Pour ton exercice, tu peux utiliser les fonction CURVE, mais je trouve ca super de débuter avec du lisp classique.

 

[Edité le 19/9/2008 par Tramber]

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Invité ingoenius
Posté(e)

merci, pour la ligne de code,

 

Mais la question est : mon programme sait-il qu'il à affaire à une polyligne ?

 

justement aprés je doir ecrire toutes les COND si c'est une polyligne, une ligne etc, j'ai testé ton code sur la polyligne 2D c'est ok, parcontre sur un polyligne 3d ca a par l'aire de fonctionner , je me trompe?

 

de plus si je trouve une poliligne fermé, 2D ou 3D et je decide d'insere 15 blocs equidistant, il faudrait que le script le detecte et que ne me souperpose pas le bloc du debut e de fin (mais cela viendrà aprés)

 

 

N'oublie pas que tu veux un ENTIER pas un REEL, donc GETINT !

tu as raison j'avais oublier est en fait j'avais mis une ligne de trop avec la commande FIX

 

 

 

Pour ton exercice, tu peux utiliser les fonction CURVE, mais je trouve ca super de débuter avec du lisp classique.

 

J'utilisp l'aiutolisp classique, car le Vlisp, je j'amais reussir a comprendre ;-(

 

bon WE je cherche 'd'avancer la semaine prochaine ;-)

 

 

 

Posté(e)

*** Il y a une erreur :

(command "_divide" ENT "B" NBLOC "_Y" NDiv ) suffit, pas besoin du ""

 

*** Je te propose de gérer les ACCROBJ :

(setq *osmode*(getvar "OSMODE")) (setvar "OSMODE" 0) au début du code

 

(setvar "OSMODE" *osmode*) à la fin

 

Ainsi, le programme fonctionnera sans ACCROBJ et ne sera pas perturbé !

 

*** Je te propose de faire un COND à la fin

 

*** Je te propose un INITGET sur GETINT

 

*** Et je te propose d'enlver des \n inutiles :

 

(defun C:PB ();path Block
 (setq *osmode*(getvar "OSMODE"))
 (setvar "OSMODE" 0)
 (setq EL (car (entsel "\nSelect Path")));selectionne le parcour
 (setq DTIPO (entget EL))
 (setq IN (cdr (assoc 10 DTIPO)));debut de ligne
 (setq OUT (cdr (assoc 11 DTIPO)));fin deligne
 (setq ENT (cdr (assoc -1 DTIPO)));nom entité dans le dessin
 
 
 
 (setq BLOCCO (car (entsel "\nSelect 1 block :")));block a cliquer dans le dessin
 (setq DatiB (entget BLOCCO))
 (setq NBLOC (cdr (assoc 2 DatiB)))
 (initget 7)
 (setq N (getreal "\nInsert Number of blocks ? :"))
 (setq NDiv (fix (- N 1)))
 (command "_divide" ENT "B" NBLOC "_Y" NDiv )

 (cond((=(cdr(assoc 0 DTIPO))"LINE")
(command "_-insert" NBLOC IN "" "" "")
(command "_-insert" NBLOC OUT "" "" ""))
      ((=(cdr(assoc 0 DTIPO))"LWPOLYLINE")	
(command "_-insert" NBLOC IN "" "" "")
(command "_-insert" NBLOC (last(mapcar 'cdr(vl-remove-if-not '(lambda(x)(=(car x)10))(entget EL)))) "" "" ""))
      )

 (setvar "OSMODE" *osmode*)
 
 )

 

 

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Tiens, tu viens de répondre !

 

Je n'avais pas vu le FIX.

Sais-tu que la fonction 1- existe ?

(setq NDiv(1-(getint "\nInsert Number of blocks ? :")))

est correct.

 

Pour t'entrainer, tu peux :

rajouter toi-même le COND des poly3D

et

chercher à savoir si une polyligne est fermée (il y a un code DXF).

 

Une autre chose à gérer est l'orientation des blocs.

 

Ca faisait longtemps que je n'avais pas quelques minutes d'affilé pour aider un débutant, ca me rappelle mes propres débuts (snif).

 

 

[Edité le 19/9/2008 par Tramber]

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Invité ingoenius
Posté(e)

ici la premiere version sur la polyligne , par contre elle prend pas en compte la rotation du premier et dernier bloc , mais dejà ca aide beaucoup

 

 
(defun C:PB ();path Block
(vl-load-com)  
(setq EL (car (entsel "\nSelect Path")))
(setq DTIPO (entget EL))

(setq LL(mapcar 'cdr(vl-remove-if-not '(lambda(x)(=(car x)10))(entget EL))))
(setq Nlist (length LL ));longueur liste
(setq END (nth (- Nlist 1) LL) ) 
(setq IN (cdr (assoc 10 DTIPO)))
(setq OUT (cdr (assoc 11 DTIPO)))
(setq ENT (cdr (assoc -1 DTIPO)))		;nom entité dal le dessin
(setq BLOCCO (car (entsel "\nSelect 1 block ")))
(setq DatiB (entget BLOCCO))			
(setq NBLOC (cdr (assoc 2 DatiB)))

(setq N (getint "\nInsert Number of blocks\n"))
(command "_divide" ENT "B"  NBLOC "_Y" N "")
(command "_-insert" NBLOC IN  "" "" "")   
(command "_-insert" NBLOC END  "" "" "")  
)

[Edité le 19/9/2008 par ingoenius]

 

[Edité le 19/9/2008 par ingoenius]

Posté(e)

 

Hello Lili

 

Mais si avec ATTREQ = 0, AutoCAD ne demande pas les attributs lors de l'insertion !

 

Tu rempliras les attributs plus tard !

 

C'est d'ailleurs un moyen classique de faire fonctionner des programmes, macros, scripts

qui traitent les blocs mais pas les attributs !

 

Ne pas oublier de remettre après ATTREQ = 1

et aussi ATTDIA = 1

 

Le Decapode "en mode ATTxxx"

 

Autodesk Expert Elite Team

Posté(e)

Bonjour à toutes et tous,

 

 

Merci pour ta réponse lecrabe ,

 

J'utilise déjà les variables ATTREQ = 0 & ATTDIA = 0 puisque j'incrémente ensuite mes attributs et pourtant voici le résultat donné par PB ici,

 

Ce qui donne =>

 

http://images4.hiboox.com/images/3808/fbc886e9ef2623904efaa6c05014524c.jpg

 

Deux constats =>

 

1 bloc inséré depuis une palette avec facteur d'echelle (au centre sur l'image ci-dessus) ne se reproduit pas pareil en bout de polyligne (il garde cependant ici l'attribut) et en cours de polyligne (plus petit et sans attribut !)

 

Les variables ATTREQ & ATTDIA semblent n'avoir aucune influence,...

 

Mais peut-être que je m'y prend mal,... ;)

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Invité ingoenius
Posté(e)

merci tramber pour tous tes conseils, j'esayerai de corriger,

en tout cas comme dejà dit plus haut j'aimerais vraiment trouver un livre (en francais) sur le V-lisp , mais appareament pour l'instant personne l'a fait purquoi pas vous??

Posté(e)

Un jour nous ferons une réunion, sorte d'Autodesk University à la Française....

 

Un jour....

 

Et nous publierons les conférences ...!?

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)

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é