Aller au contenu

Bloc en 3D : un Lisp ?


Messages recommandés

Posté(e)

Bonsoir,

 

J'ai un bloc (en fait des milliers) inseré en 2D (Z=0) avec un attribut texte qui représente l'altitude.

J'ai besoin de déplacer ces blocs à leurs altitudes respectives.

 

Je pensais que Covadis le faisait, mais j'ai beau chercher, je ne trouve pas :P

 

Connaissais-vous une routine (Lisp ou autre) qui le ferais ??

 

Merci d'avance

 

Posté(e)

Bonsoir,

 

Si covadis le fait, il y a même deux solutions :

 

Covadis 2D => Points Topographiques => Modification des altitudes et là tu coches le bouton radio "Mettre / garder les points en 3D". En fait cette option permet de transformer le texte de l'étiquette en une "hauteur "AutoCAD

 

Covadis 3D => Construction 3D =>Transformation 2D => 3D et là, la gestion est plus souple (noms de blocs, calques, entités 2D,...) et surtout, les points non immatriculés peuvent être interpolés (le top quand on fait du projet !!).

 

Aprés un lisp pour pouvoir le faire que depuis AutoCAD, il me semble que Bonuscad en a proposé mais je ne sais plus ou,... (ressemble alors à l'option 2D de covais, de mémoire !)

 

Bon courage.

 

[Edité le 28/9/2007 par lili2006]

Civil 3D 2025 - COVADIS_18.3b

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

Posté(e)

Bonsoir,

 

j' ai un vba qui peut être testé pour cela, sans garantie.

Il faut mettre le nom de l 'étiquette où c 'est indiqué.

Je ne sais pas si c'est adèquat ?

 

 
Dim obj As AcadEntity
Dim blocref As AcadBlockReference
Dim attributs As Variant
Dim strAttributes As String
Dim I As Integer
Dim ptbase(0 To 2) As Double
Dim ptdest(0 To 2) As Double


Public Sub place_altitude()
ptbase(0) = 0: ptbase(1) = 0: ptbase(2) = 0
ptdest(0) = 0: ptdest(1) = 0: ptdest(2) = 0
Stop
For Each obj In ThisDrawing.ModelSpace
   If obj.ObjectName = "AcDbBlockReference" Then
   Set blocref = obj
   attributs = blocref.GetAttributes
       For I = LBound(attributs) To UBound(attributs)
           If attributs(I).TagString = "ALTITUDE" Then 'mettre ici entre guillemets l'étiquette en majuscule
           ptdest(2) = attributs(I).TextString
           blocref.Move ptbase, ptdest
           End If
       Next
   End If
Next

End Sub

Posté(e)

Les commandes décrites par lili2006 fonctionent dans le cas ou il sagit de bloc contenant un atribut avec etiquette ALT et un attribut avec etiquette MAT

 

 

si il sagit de point AUTOCAD en 2D et de TEXTE indiquant la valeur d'altitude, alors avec Covadis la bonne commande c'est

 

COV EDITION/POINTS TOPOGRAPHIQUES/ALTITUDE SELON TEXTE

 

 

Bon courage

 

[Edité le 28/9/2007 par thierry.garré]

Thierry Garré

 

Géorail-Covadis-Autopiste-Autocad-Autocad Map-Infraworks 360- Navisworks -Recap

Posté(e)

Suis chez des amis

Apéro

sans souris :P

 

Thierry a raison

 

les solutions de lili... j ai essayé ca marche pas

 

le lisp de nanerap essai lundi

 

desole pas de mulot :calim:

Posté(e)

COV EDITION/POINTS TOPOGRAPHIQUES/ALTITUDE SELON TEXTE

 

oui ca marche

mais le point d insertion c est celui de l attribut

mais pas celui du bloc

 

meme en utisisant Burst pour convertir l attribut en texte

 

Mon bloc : un cercle avec hachure Solid + 1attribut texte

 

ex : . 56.34

 

Rappel : pas de souris :P

 

[Edité le 28/9/2007 par kallain]

Posté(e)

Salut,

 

Edit bloc ne permet pas de modifier certaines entités d'un bloc, il permet de modifier les propriétés de toutes les entités des définitions de bloc (au départ, j'avais fait ça pour "nettoyer" des collections de blocs récupérées ici ou là et les remettre à l'échelle ou l'unité qui convient, puis ça s'est etoffé au fur et à mesure des demandes)

 

Tu peux essayer ce LISP après avoir remplacé NomDuBloc par le vrai nom du bloc (je ne l'ai pas testé)

 

Après quelques tests, je modifie un peu la routine, pour plus de polyvalence il est demandé à l'utilisateur d'entrer le nom du bloc et l'étiquette de l'attribut qui contitent l'altitude.

 

(defun c:bloc-alt (/ ins att)
 (vl-load-com)
 (and
   (setq name (getstring T "\nEntrez le nom du bloc: "))
   (setq tag (getstring "\nEntrez l'étiquette de l'attribut: "))
   (ssget "_X" (list '(0 . "INSERT") (cons 2 name)))
   (vlax-for b	(vla-get-ActiveSelectionSet
	  (vla-get-ActiveDocument
	    (vlax-get-acad-object)
	  )
	)
     (setq ins	(vlax-get b 'InsertionPoint)
    att	(vlax-invoke b 'getAttributes)
     )
     (foreach a att
(if (and (= (vla-get-TagString a) (strcase tag))
	 (numberp (setq alt (read (vla-get-TextString a))))
	 )
  (vla-Move
    b
    (vlax-3d-point '(0 0 0))
      (vlax-3d-point (list 0 0 alt))
  )
)
     )
   )
 )
 (princ)
)

 

[Edité le 29/9/2007 par (gile)]

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

Posté(e)

La routine est construite avec les expression à l'intérieur d'un (and..)

(and

(expr1)

(expr2)

(expr3)

)

 

Cette méthode (plus concise) permet à la routine de s'arréter proprement si un des expression était nulle, mais ne renseigne pas sur l'origine de l'erreur.

 

Donc,i la routine ne fait rien, soit :

- il n'y a aucune référence de bloc qui correspond au nom entré ;

- le bloc ne contient pas d'attribut avec l'étiquette entrée ;

- la valeur de l'attribut n'est pas un nombre valide ;

- les blocs sont déjà insérés à leurs altitudes respectives !

 

Si j'ai le temps je posterais une version qui contrôle la validité des argument et retourne des messages en cas d'erreur.

 

 

[Edité le 29/9/2007 par (gile)]

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

Posté(e)

Bonjour, c'est lundi, youpi.

 

Désolé nazemrap, mais je ne connais rien en VBA :(

(enregistrement ?, Chargement ?, Exécution???)

 

Le Lisp de (gile) marche à merveille.

Mes points sont en 3D.

 

Merci (gile) ;)

 

Nota

- les blocs sont déjà insérés à leurs altitudes respectives !

 

J'avais déplacé qques blocs à la "main".

Ils se retrouvent au double de leur altitude

EX: 57.23 passe à 114.46

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é