Aller au contenu

Insertion d'un bloc sous AutoCAD avec LISP ou PYTHON


Novice_python

Messages recommandés

Bonjour à tous,

 

Je suis confronté à un problème sous AutoCAD. En effet, je dispose d'un fichier TXT (voir ci-dessous) avec plusieurs colonnes respectant un certain formalisme:

- nom du bloc

- nom du calque d'insertion

- Couleur du bloc

- Echelle X

- Echelle Y

- Echelle Z

- Position X

- Position Y

- Position Z

- Rotation.

 

Je voudrais ainsi insérer les différents blocs dans le dessin à partir d'un LISP et/ou de PYTHON. Tout d'abord, existe il un lien entre PYTHON et AUTOCAD ? Si oui, comment pourrais y parvenir ?

 

Ensuite, je maîtrise depuis peu le langage LISP pour AUTOCAD. Je souhaite ainsi insérer les blocs dans le plan DWG en tenant compte des différentes contraintes énoncées précédemment. Après avoir lu différentes discussions, j'ai toujours du mal à parvenir à créer ce script.

 

Voici un extrait de mon fichier txt :

 

Nom,Calque,Couleur,Echelle X,Echelle Y,Echelle Z,Position X,Position Y,Position Z,Rotation

101_extrem_garde_corps,SIGNS,blanc,1.0000,1.0000,1.0000,-179.4869,188.1703,0.0000,100.0000g

102_bouche_a_cle,AEPS,cyan,1.0000,1.0000,1.0000,-200.4781,162.0923,0.0000,100.0000g

105_regard_AEP,AEPS,cyan,1.0000,1.0000,1.0000,0.0000,0.0000,0.0000,100.0000g

106_support_affichage,URBS,blanc,1.0000,1.0000,1.0000,-116.7551,184.4099,0.0000,100.0000g

108_rocher,SIGNS,blanc,1.0000,1.0000,1.0000,-179.3882,181.5267,0.0000,100.0000g

 

Merci d'avance pour votre aide !! :)

Lien vers le commentaire
Partager sur d’autres sites

Voici un exemple d'insertion de bloc en python.

Il te faut importer win32com et que ton bloc soit définis dans le dessin

Avec win32com tu as accès à l'interface com/ActiveX d'autocad

 

import win32com.client
import pythoncom

def AcadPoint(pt):
   """ Take 2D or 3D point (x, y, [z]) and return a variant array of double to deal with autocad com interface """
   if len(pt) == 2:
       pt = Point2D3D(pt)
   return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, pt) ## type: 8192 + 5 = 8197

def Point2D3D(pt):
   """ Take a 2D point (x, y) and return a 3D point (x, y, 0) """
   return (pt[0],pt[1], 0)


acad = win32com.client.Dispatch("AutoCAD.Application")
if AutoCAD != None:
  doc = acad.ActiveDocument
  ms = doc.ModelSpace
  pt = AcadPoint((0,0,0))
  # RetVal = object.InsertBlock(InsertionPoint, Name, Xscale, Yscale, ZScale, Rotation [, Password]) 
  blk = ms.InsertBlock(pt,"monblock", 1, 1, 1, 0)
  blk.Layer = "moncalque"

Aide au téléchargement du cadastre dgfip-download-helper
Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0
Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Vincentp010,

 

Merci tout d'abord pour ta réponse !

 

J'ai essayé de comprendre ton script, mais j'ai un message d'erreur lorsque je l'exécute.

 

import win32com.client

import pythoncom

 

def AcadPoint(pt):

""" Take 2D or 3D point (x, y, [z]) and return a variant array of double to deal with autocad com interface """

if len(pt) == 2:

pt = Point2D3D(pt)

return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, pt) ## type: 8192 + 5 = 8197

 

def Point2D3D(pt):

""" Take a 2D point (x, y) and return a 3D point (x, y, 0) """

return (pt[0],pt[1], 0)

 

 

acad = win32com.client.Dispatch("TEST_PLANCHE.dwg")

if TEST_PLANCHE != None:

doc = acad.ActiveDocument

ms = doc.ModelSpace

pt = AcadPoint((0,0,0))

# RetVal = object.InsertBlock(InsertionPoint, Name, Xscale, Yscale, ZScale, Rotation [, Password])

blk = ms.InsertBlock(pt,"106", 1, 1, 1, 0)

blk.Layer = "VEG"

 

J'ai modifié ton script afin que j'insère le bloc "106" défini dans le dessin, dans le calque "VEG". Est-ce bien la bonne méthode ?

 

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Il ne faut pas mettre le nom du dessin dans la commande Dispatch, le dessin doit être ouvert dans autocad avant de lancer le script.

 

La bonne syntaxe est bien celle ci sans modifications

accad = win32com.client.Dispatch("AutoCAD.Application")
if accad != None:

(J'ai mis accad car le forum remplace automatiquement "acad" par "Autocad" à cet endroit :angry: )

 

Ton bloc doit être définit dans le dessin et le calque doit exister.

 

N’hésite pas si tu as des questions.

Aide au téléchargement du cadastre dgfip-download-helper
Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0
Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js

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é