Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

Des maîtres Lispien m'ont appris à inseré un bloc (et à le taiter enssuite) grâce à (vla-InsertBlock...

Mais j'ai vraiment un souci d'orientation. Vu que l'insertion se fait dans le SCG, j'arrive bien à récupérer le point comme on me l'a appris (trans...), mais je n'arrive pas à récupérer l'ORIENTATION du SCU... afin que mon bloc inseré soit bien dans le sens du SCU affiché...

 

merci d'avance

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

La variable systéme UCSXDIR donne les coordonnées du X du SCU dans le SCG (le vecteur normal).

 

(angle '(0 0 0) (getvar "UCSXDIR")) retourne l'angle, en radians, de la projection de l'axe des X du SCU sur le plan du SCG avex l'axe des X du SCG.

 

Si le plan du SCU est parallèle au plan du SCG, c'est l'angle entre les axes des X des deux systèmes.

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

Posté(e)

Ceci, je l'avais trouvé (avec UCSYDIR aussi ...) mais j'ai vraimment du mal à mettre en écrit le programme, car j'ai aussi l'angle des Z qui peut rentrer en jeu (exemple : je dois poser un Bloc "cube" sur un sol en pente...)

Autant avec le -insert d'autocad cela se fait automatiquement, autant j'ai du mal à déterminer la manière en vl pour dire à mon bloc de s'orienter ET s'incliner ... (l'orientation je vois, mais l'inclinaison sur les Z...)

merci

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Pour obtenir l'équivalent de UCSXDIR sur l'axe des Z du SCU courant, tu peux faire :

 

(setq UCSZDIR (trans '(0 0 1) 1 0 T))

 

C'est ce qu'on appelle la direction d'extrusion ou le code 210 en dxf ou bien encore la propriété Normal en vla-

 

Voir ce sujet.

 

Mais il me semble que vla-insertblock insère le block dans le plan du SCU courant (à vérifier).

 

[Edité le 19/5/2006 par (gile)]

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

Posté(e)

 

Mais il me semble que vla-insertblock insère le block dans le plan du SCU courant (à vérifier).

 

j'ai vérifier en testant...

:casstet:

Je ne comprend pas... :P

 

(setq pt (getpoint))

(vla-InsertBlock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))

(vlax-3d-point (trans pt 1 0)) "mon block" 1 1 1 0)

 

Lorsque je déplace mon SCU sur Z (rotation sur les Z), les blocs s'insère selon le SCG...

...

Lorque je fait une rotation par 3 point (X, Y et Z changent) ça à l'air de fonctionner...

sauf que le bloc ne s'insert plus sur le bonne axe (Y à la place de X par exemple...)

 

Merci de votre aide ...

 

 

 

 

 

 

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Çà m'est revenu, le problème avait déjà été posé je ne sais plus où.

 

Il faut traduire UCSXDIR dans la normale du plan :

 

(vla-InsertBlock
 (vla-get-modelspace
   (vla-get-activedocument (vlax-get-acad-object))
 )
 (vlax-3d-point (trans pt 1 0))
 "mon block"
 1
 1
 1
 (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T)))
) 

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

Posté(e)

He bien j'crois c'est CLAIR !!!!... ça fonctionne trés bien...

 

Donc...

(angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T)))

... permet de calculer l'angle entre le point (0 0 0) et le point donné par UCSXDIR trans(formé) en ... là, y'a des neuronnes qui sont devenu fluorescentes!!!...

Si du côté d'Antibes cette nuit il y a un gros flash, c'est moi qui n'aurait pas tenu le choc à tenter de comprendre...

En tout cas merci (pas pour mes neuronnes...) :P

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Pour un débutant, tu as mis la barre plutôt haut !

 

Je pense que le VisualLISP n'est le plus facile pour commencer parcequ'il ne dispense pas de manipuler aussi AutoLISP qui reste la base.

 

Et les problèmes en 3D (SCU non parallèles au SCG) ne sont pas toujours facile à appréhender.

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

Posté(e)

Enfin !!! je suis arrivé à ce que je voulais.... ;)

Je met ma routine ci dessous.

merci à tous ce qui m'ont aidé.... au prochain problème !!! :P

 

Donc le lisp ci-dessous permet d'inserer un bloc... c'est compliqué, mais c'est une réponse au problème de gestion des blocs lorsqu'il sont inserer automatiquement dans une parti non affiché à l'écran, et qui provoque une erreur...

(la mise sur "calqueTempo" permet de pouvoir tout récuperer avec un

 

(setq sel (ssget "_X" '((8 . "calque_Tempo"))))

 

 

 
(defun c: MONLISP ()
(setq pt (getpoint "\n Point d'insertion :")
          chem "MonBloc"
           Rot 180)
(InsBlocdec_calqueTempo (trans pt 1 0) eb Rot)
)
;;;;;;;;;  Insert bloc rotation (Rot) degré + DECOMPOSER + mise sur calqueTempo ;;;;;;;;;;;;;;;;;;;;;;
(defun InsBlocdec_calqueTempo (pt chem Rot / a b)
(setq a (vla-InsertBlock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
(vlax-3d-point pt) chem 1 1 1
(angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T)))))
(foreach b (vlax-safearray->list(vlax-variant-value (vla-explode a)))
(vla-rotate b (vlax-3d-point pt)(/ (* pi Rot) 180))
(vla-put-layer b calque_Tempo))
(vla-delete a)
)

 

... voilà, c'est tout

merci encore.

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Juste deux petits détails :

 

Tu affectes 180° à Rot et ensuite tu fais une rotation de 180° en faisant une conversion pour avoir des radians, ce faisant, tu multiplies pi par 180 pour le diviser par 180.

 

Il serait plus élégant de travailler directement en radians et faire simplement :

(vla-rotate b (vlax-3d-point pt) pi)

sans avoir besoin de définir Rot.

 

Tu pourrais aussi éviter de définir une variable pour "MonBloc" et le passer directement comme argument à InsBlocdec_calqueTempo.

 

Ce qui pourrait faire :

 

defun c: MONLISP (/ pt)
(setq pt (getpoint "\n Point d'insertion :"))
(InsBlocdec_calqueTempo (trans pt 1 0) "MonBloc")
)
;;;;;;;;; Insert bloc rotation (Rot) degré + DECOMPOSER + mise sur calqueTempo ;;;;;;;;;;;;;;;;;;;;;;
(defun InsBlocdec_calqueTempo (pt chem / a b)
(setq a (vla-InsertBlock (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
(vlax-3d-point pt) chem 1 1 1
(angle '(0 0 0) (trans (getvar "UCSXDIR") 0 (trans '(0 0 1) 1 0 T)))))
(foreach b (vlax-safearray->list(vlax-variant-value (vla-explode a)))
(vla-rotate b (vlax-3d-point pt) pi)
(vla-put-layer b calque_Tempo))
(vla-delete a)
) 

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

Posté(e)

Merci (gile) de tes remarques.

 

En fait j'affecte 180 ° à Rot, mais c'est justement pour me servir de "InsBlocdec_calqueTempo " dans d'autre lisp ou la valeur de Rot doit être différente (je ne l'ai pas signalé mais (defun c: MONLISP n'est qu"un lisp "test" permettant de faire fonctionne ma routine "InsBlocdec_calqueTempo "...) comme ça je peux rentrer la roration que je désire, et en degré afin de ne pas me poser de question dans l'écriture d'autre lisp ...

 

De même que pour la variable de "mon bloc", je le fais car dans un lisp j'aime bien écrire en début tout les chemins des blocs et des fichiers que j'utilise, et de les rentrer dans des variables afin de pouvoir les regrouper tous au même endroit, et si il y à une modif, c'est + facilement retrouvable...

 

merci encore en tout cas...

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

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é