Aller au contenu

(vla-add (vla-get-Blocks... SCU ???


Messages recommandés

Posté(e)

Bonjour,

 

Je créé un bloc grâce à (vla-add (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object)))...

 

Je "travail" dedans ensuite par rapport à un point '(0 0 0) et 2 point p1 et p2 que j'ai pris soin de transformer en SCG avec (trans p1 1 0)....

 

J'insert ensuite le bloc grâce à vla-insertblock

 

Quand je suis en SCG, pas de problème.

Par contre, si je suis en SCU, dans mon bloc inséré c'est le bordel....

 

Bosser dans un "vla-get-Blocks" ne se passe pas uniquement en SCG ?

 

Merci d'avance

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

Posté(e)

Salut,

 

(setq bloc (vla-add (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) "bloc"))

ajoute une définition de bloc à la table des bloc nommée "bloc".

 

(vla-AddLine bloc (vlax-3d-point '(0 0 0)) (vlax-3d-point '(1 2 3)))

ajoute une ligne dans la définition du bloc du point (0 0 0) au point (1 2 3). Ces points étant définis dans le système de coordonnées de la définition du bloc.

 

Je ne comprends pas ce que viens faire le SCU là dedans. les SCU ne concerne que les espace courants.

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

Posté(e)

En bref, en programmation, on ne doit se préoccuper du SCU courant que dans les cas suivants :

- l'acquisition de données (fonctions get*, entsel, etc.) qui renvoient toujours les points en coordonnées SCU ;

- l'appel aux commandes (command, command-s, vl-cmdf, vla-SendComand) qui se réfèrent toujours au SCU courant.

 

Avec les fonctions vla* ou entmake, on utilise toujours le SCG (ou son équivalent dans des définitions de bloc) ou le SCO pour les polylignes (LWPOLYLINE) ainsi que pour d'autres entités 2d en ce qui concerne entmake.

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

Posté(e)

Je fais pas mal de rotation de bloc (vla-rotate3d), de bascule (vla-put-normale) dans mon lisp, à l'interieur du bloc "(vla-add (vla-get-Blocks" et de création de texte avec "(vla-AddMText Bloc..." et j'ai l'impression que ça prend en compte compte le SCU, car j'ai vraiment une différence à l'insertion avec vla-insertblock entre le SCG et le SCU.

 

Dès que je trouve un moment, j’essaye de coder un exemple simple pour le mettre ici.

 

Merci

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

Posté(e)

Re,

 

Alors voilà un principe qui, que l'on soit en SCG ou en SCU ne donne pas le même résultat alors que je pense ne travailler qu'en SCG...

 

(defun c:eee ( / ANG BLOC_FINAL NOM-BLOC-FINAL P1 P1SCG
      P2 P2SCG TXT VECT-P1P2 VECT-Z CIRCLE PLAN-P1)

(setq p1 (getpoint)
 p2 (getpoint p1)
 ang (angle p1 p2)
 p1scg (trans p1 1 0)
 vect-p1p2 (mapcar '- p2 p1)
 vect-Z '(0.0 0.0 1.0))

(setq plan-p1.p2.Z (list (- (* (cadr vect-p1p2) (caddr vect-Z)) (* (caddr vect-p1p2) (cadr vect-Z)))
		    (- (* (caddr vect-p1p2) (car vect-Z)) (* (car vect-p1p2) (caddr vect-Z)))
		    (- (* (car vect-p1p2) (cadr vect-Z)) (* (cadr vect-p1p2) (car vect-Z)))
		    ))

;;; Crée Bloc-final dans collection
(setq Nom-Bloc-final (strcat "Bloc-final" (itoa (fix (* (getvar "TDUSRTIMER") 10000000))))
     Bloc_final (vla-add (vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object)))  (vlax-3d-point '(0 0 0)) Nom-Bloc-final))  

;;; Ecrit Texte dans Bloc-Final
(setq txt (vla-AddMText Bloc_final (vlax-3d-point '(0 0 0)) 0.01  "<---- SENS P1 P2----->"))
;;; rotation txt vers p2
(vla-put-rotation txt ang)
;;; bascule txt sur le plan p1/p2/sens Z SCG
(vla-put-normal txt (vlax-3d-point plan-p1.p2.Z))


;;; cercle dans Bloc-Final
(setq circle (vla-AddCircle Bloc_final (vlax-3d-point (polar '(0 0 0) ang (/ (distance p1 p2) 2))) (/ (distance p1 p2) 2)))
;;; bascule cercle sur le plan p1/p2/sens Z SCG
(vla-put-normal circle (vlax-3d-point plan-p1.p2.Z))

(vla-insertblock  (vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point p1scg) Nom-Bloc-final 1 1 1 0)
 )

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

Posté(e)

J'ai un peu regardé cette histoire.

 

quelques petites corrections à ton code.

- transformer les deux points (p1 et p2) en SCG avant de calculer la normale du plan vertical qui les contient

- définir l'angle dans ce plan

- faire la rotation du mtext après avoir changé sa normale

- transformer le centre du cercle définit dans le SCO en SCG

 

Sinon, j'ai dit une bêtise. vla-insertblock prend en compte la normale (axe Z) du scu courant, il faut donc forcer la normale du bloc inséré en (0 0 1) et transformer le point d'insertion.

 

(defun c:eee (/
      ANG
      BLOC_FINAL
      NOM-BLOC-FINAL
      P1
      P1SCG
      P2
      P2SCG
      TXT
      VECT-P1P2
      VECT-Z
      CIRCLE
      PLAN-P1
     )

 (setq	p1	  (getpoint)
p2	  (getpoint p1)
p1scg	  (trans p1 1 0)
p2scg	  (trans p2 1 0)
vect-p1p2 (mapcar '- p2scg p1scg)
vect-Z	  '(0.0 0.0 1.0)
 )

 (setq	plan-p1.p2.Z
	     (list (- (* (cadr vect-p1p2) (caddr vect-Z)) (* (caddr vect-p1p2) (cadr vect-Z)))
		   (- (* (caddr vect-p1p2) (car vect-Z)) (* (car vect-p1p2) (caddr vect-Z)))
		   (- (* (car vect-p1p2) (cadr vect-Z)) (* (cadr vect-p1p2) (car vect-Z)))
	     )
ang	     (angle (trans p1scg 0 plan-p1.p2.Z) (trans p2scg 0 plan-p1.p2.Z))
 )

 ;; Crée Bloc-final dans collection
 (setq	Nom-Bloc-final (strcat "Bloc-final" (itoa (fix (* (getvar "TDUSRTIMER") 10000000))))
Bloc_final     (vla-add	(vla-get-Blocks (vla-get-activedocument (vlax-get-acad-object)))
			(vlax-3d-point '(0 0 0))
			Nom-Bloc-final
	       )
 )

 ;; Ecrit Texte dans Bloc-Final
 (setq txt (vla-AddMText Bloc_final (vlax-3d-point '(0 0 0)) 0.0 "<---- SENS P1 P2----->"))
 ;; bascule txt sur le plan p1/p2/sens Z SCG
 (vla-put-normal txt (vlax-3d-point plan-p1.p2.Z))
 ;; rotation txt vers p2
 (vla-put-rotation txt ang)


 ;; cercle dans Bloc-Final
 (setq
   circle (vla-AddCircle
     Bloc_final
     (vlax-3d-point (mapcar '(lambda (x) (/ x 2.)) vect-p1p2))
     ;;(vlax-3d-point (trans (polar '(0 0 0) ang (/ (distance p1 p2) 2)) plan-p1.p2.Z 0))
     (/ (distance p1 p2) 2)
   )
 )
 ;; bascule cercle sur le plan p1/p2/sens Z SCG
 (vla-put-normal circle (vlax-3d-point plan-p1.p2.Z))

 (vla-put-Normal
   (vla-insertblock
     (vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object)))
     (vlax-3d-point (trans p1scg (trans '(0 0 1) 1 0 T) 0))
     Nom-Bloc-final
     1
     1
     1
     0
   )
   (vlax-3d-point '(0 0 1))
 )
)

 

Le faire avec entmake me semble plus simple et plus fiable.

(defun c:aaa (/
      ANG
      BLOC_FINAL
      NOM-BLOC-FINAL
      P1
      P1SCG
      P2
      P2SCG
      TXT
      VECT-P1P2
      VECT-Z
      CIRCLE
      PLAN-P1
     )

 (setq	p1	  (getpoint)
p2	  (getpoint p1)
p1scg	  (trans p1 1 0)
p2scg	  (trans p2 1 0)
vect-p1p2 (mapcar '- p2scg p1scg)
vect-Z	  '(0.0 0.0 1.0)
 )

 (setq	plan-p1.p2.Z
	     (list (- (* (cadr vect-p1p2) (caddr vect-Z)) (* (caddr vect-p1p2) (cadr vect-Z)))
		   (- (* (caddr vect-p1p2) (car vect-Z)) (* (car vect-p1p2) (caddr vect-Z)))
		   (- (* (car vect-p1p2) (cadr vect-Z)) (* (cadr vect-p1p2) (car vect-Z)))
	     )
ang	     (angle (trans p1scg 0 plan-p1.p2.Z) (trans p2scg 0 plan-p1.p2.Z))
 )

 ;; Crée Bloc-final dans collection
 (setq Nom-Bloc-final (strcat "Bloc-final" (itoa (fix (* (getvar "TDUSRTIMER") 10000000)))))
 (entmake (list '(0 . "BLOCK")
	 (cons 2 Nom-Bloc-final)
	 '(70 . 0)
	 '(10 0 0 0)))
 (entmake (list '(0 . "MTEXT")
	 '(100 . "AcDbEntity")
	 '(100 . "AcDbMText")
	 '(10 0 0 0)
	 '(1 . "<---- SENS P1 P2----->")
	 (cons 210 plan-p1.p2.Z)
	 (cons 50 ang)
   )
 )
 (entmake (list '(0 . "CIRCLE")
	 (cons 10 (trans (mapcar '(lambda (x) (/ x 2.)) vect-p1p2) 0 plan-p1.p2.Z))
	 (cons 40 (/ (distance p1 p2) 2))
	 (cons 210 plan-p1.p2.Z)
   )
 )
 (entmake '((0 . "ENDBLK")))
 
 (entmake (list '(0 . "INSERT")
	 (cons 2 Nom-Bloc-final)
	 (cons 10 p1scg)))
)

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

Posté(e)

OK, je vais approfondir ça. Merci

Tes codes semblent fonctionner, mais pas pour le texte il me semble.

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

Posté(e)

J'avais effectivement noté des problèmes avec la rotation du mtexte, puis après avoir redémarré AutoCAD ça ne se reproduisait plus.

Je viens de refaire des essais et il semble bien qu'il y ait un bug avec l'objet MTEXT. Si on trace la rotation en faisant un pas à pas tout semble correct : (angtos (vla-get-Rotation txt)) renvoie la bonne valeur, mais une fois le bloc inséré, la rotation a changé (pas toujours) et si on ouvre la définition du bloc dans l'éditeur de bloc, on voit bien que la propriété rotation du mtexte a changé.

J'ai essayé avec un texte simple à la place du texte multiligne et tout fonctionne comme attendu (comme quoi les dinosaures qui recommandaient d'utiliser des textes simples plutôt que des textes multiligne n'avaient pas tort).

 

En conclusion, je dirais que les textes multilignes ne semble pas d'une robustesse à toute épreuve en 3D et que la fonction vla-InsertBlock n'a pas un fonctionnement cohérent suivant que le plan XY du SCU courant soit pas parallèle au plan XY du SCG ou pas.

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

Posté(e)

Hello

 

C le/les Dinosaure(s) qui parle(nt) (Lecrabe, Didier, Christian, etc) ... Vive les Textes simples !

 

Surtout quand en SIG/Cartographie/Cadastre ENORME, vous avez des dizaines / centaines de milliers ou millions de Textes !!

 

LA SANTE (Stay Safe), Bye, le crabe "triste"

Automne 2020, la retraite

Autodesk Expert Elite Team

Posté(e)

... bon, c'est vraiment trop tordu pour mon cas, afin d'avoir un truc propre j'insert des entités diverses (texte, bloc de biblio...) dans des blocs qu'ensuite j'insert dans un bloc final pour l'inserer dans AutoCAD...

Et ces entitées je les oriente et bascule selon pas mal de paramètres...

 

Solution : je bascule en SCG après la sélection des points...

 

Merci pour votre temps.

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é