| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > PyAcad.Net - Iron Python для программирования в Автокаде

PyAcad.Net - Iron Python для программирования в Автокаде

Ответ
Поиск в этой теме
Непрочитано 05.09.2008, 22:06 #1
PyAcad.Net - Iron Python для программирования в Автокаде
Красин
 
Регистрация: 05.09.2008
Сообщений: 24

Обратите внимание на интересный проект http://code.google.com/p/pyacaddotnet/
Его обсуждение на форуме "Болото":
http://www.theswamp.org/index.php?topic=24603.0
Мое мнение — это была бы лучшая замена VBA, если довести до ума.
Python очень хорош для макросов.
То, что они сейчас выложили - работает под 2008 автокад (хотя могли сделать и под все версии с 2006 по 09?).
Надо распаковать архив в любую папку, в автокад командой _.netload загрузить сборку PyAcadDotNet.dll, которая находится в корне этой папки.
далее набираете команду pyfile - открывается диалоговое окно в котором нужно выбрать файл скрипта на Python. Примеры скриптов лежат в папке Samples.
Проект только зародился, но я думаю, что у него большое будущее.
PyAcad.net позволяет программировать под автокад 2008 с применением ObjectArx.Net api а также с помощью COM (потребуется только самостоятельно сделать сборку для взаимодействия с помощью tlbimp.exe в составе netsdk).
Хочу предоставить пару примеров:
листинг аттрибутов блока:
Код:
[Выделить все]
import clr
import System
clr.AddReference('System.Windows.Forms')
from Autodesk.AutoCAD.ApplicationServices import *
from  Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.AutoCAD.EditorInput import *
from  Autodesk.AutoCAD.Runtime import * 
from  Autodesk.AutoCAD.Windows import * 
from System.Collections.Generic import List
doc = Application.DocumentManager.MdiActiveDocument
ed = doc.Editor
db = doc.Database


def ListAttributes():

	filList = List[TypedValue]()
	filList.Add(TypedValue(int(DxfCode.Start), "INSERT"))
	filter = SelectionFilter(filList.ToArray())
	opts = PromptSelectionOptions()
	opts.MessageForAdding = "Select block references: "
	res = ed.GetSelection(opts, filter)
	if res.Status != PromptStatus.OK:
		return
	selSet = res.Value
	idArray = selSet.GetObjectIds()
	tr = db.TransactionManager.StartTransaction()
	try:		
		for blkId in idArray:
			blkRef = tr.GetObject(blkId,OpenMode.ForRead)
			btr = tr.GetObject(blkRef.BlockTableRecord,OpenMode.ForRead)
			ed.WriteMessage("\nBlock: " + btr.Name)
			btr.Dispose()
			attCol = blkRef.AttributeCollection
			for attId in attCol:
				attRef = tr.GetObject(attId,OpenMode.ForRead)
				str = "\n  Attribute Tag: %s\n  Attribute String: %s" % (attRef.Tag,attRef.TextString)
				ed.WriteMessage(str)
		tr.Commit()
	finally:
		tr.Dispose()			

try:
	ListAttributes()
except Exception,detail:
	print detail
листинг вершин полилинии:
Код:
[Выделить все]
# Iterating through a polyline's vertices using AutoCAD .NET
#http://through-the-interface.typepad.com/through_the_interface/2007/04/iterating_throu.html
import clr
import System

from Autodesk.AutoCAD.ApplicationServices import *
from  Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.AutoCAD.EditorInput import *
from  Autodesk.AutoCAD.Runtime import * 


doc = Application.DocumentManager.MdiActiveDocument
ed = doc.Editor
db = doc.Database
	  
def listVerices():
	per = ed.GetEntity("Select a polyline")
	if per.Status == PromptStatus.OK:
		tr = db.TransactionManager.StartTransaction()
		try:
			obj = tr.GetObject(per.ObjectId, OpenMode.ForRead)
			if type(obj) is Polyline:
				for i in range(obj.NumberOfVertices):
					pt = obj.GetPoint2dAt(i)
					print pt
			elif type(obj) in [Polyline2d,Polyline3d]:
				for vId in obj:
					v = tr.GetObject(vId, OpenMode.ForRead)
					print v.Position
			tr.Commit()
		finally:
			tr.Dispose()			

try:
	listVerices()
except Exception,detail:
	print detail
вставка таблицы и связи с эксель
Код:
[Выделить все]
import clr
import System
clr.AddReference('System.Windows.Forms')
from Autodesk.AutoCAD.ApplicationServices import *
from  Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.AutoCAD.EditorInput import *
from  Autodesk.AutoCAD.Runtime import * 
from  Autodesk.AutoCAD.Windows import * 

doc = Application.DocumentManager.MdiActiveDocument
ed = doc.Editor
db = doc.Database

	  
def TableFromSpreadsheet():
	dlName = "Import table from Excel demo"
	ofd = OpenFileDialog("Select Excel spreadsheet to link",None,
		"xls; xlsx","ExcelFileToLink",OpenFileDialog.OpenFileDialogFlags.DoNotTransferRemoteFiles)
	dr = ofd.ShowDialog()
	if dr != System.Windows.Forms.DialogResult.OK:
		return
	ed.WriteMessage("\nFile selected was \"{0}\".",ofd.Filename)
	ppr = ed.GetPoint("\nEnter table insertion point: ")
	if ppr.Status != PromptStatus.OK:
		return
	dlm = db.DataLinkManager
	dlId = dlm.GetDataLink(dlName)
	if dlId != ObjectId.Null:
		dlm.RemoveDataLink(dlId)
	dl = DataLink()
	dl.DataAdapterId = "AcExcel"
	dl.Name = dlName
	dl.Description = "Excel fun with Through the Interface"
	dl.ConnectionString = ofd.Filename
	dl.DataLinkOption = DataLinkOption.PersistCache
	dl.UpdateOption |= int(UpdateOption.AllowSourceUpdate)
	doclock = Application.DocumentManager.MdiActiveDocument.LockDocument()
	dlId = dlm.AddDataLink(dl)
	tr = db.TransactionManager.StartTransaction()
	try:
		tr.AddNewlyCreatedDBObject(dl, True)
		bt = tr.GetObject(db.BlockTableId,OpenMode.ForRead)
		tb = Table()
		tb.TableStyle = db.Tablestyle
		tb.Position = ppr.Value
		tb.SetDataLink(0, 0, dlId, True)
		tb.GenerateLayout()
		btr = tr.GetObject(db.CurrentSpaceId,OpenMode.ForWrite)
		btr.AppendEntity(tb)
		tr.AddNewlyCreatedDBObject(tb, True)
		tr.Commit()
	finally:
		ed.Regen()
		tr.Dispose()			

try:
	TableFromSpreadsheet()
except Exception,detail:
	print detail
Просмотров: 9631
 
Автор темы   Непрочитано 05.09.2008, 22:47 пример с COM
#2
Красин


 
Регистрация: 05.09.2008
Сообщений: 24


Вот как можно с помощью СОМ поместить все примитивы во всех блоках текущего чертежеа на 0 слой и назначить им цвет и толщину линии "по блоку".

Код:
[Выделить все]
import clr
import System
clr.AddReferenceToFileAndPath(r"E:\AutoCAD.dll") #путь к сборке 
from AutoCAD import *
import Autodesk.AutoCAD.ApplicationServices as ap
doc = ap.Application.DocumentManager.MdiActiveDocument.AcadDocument
for layer in doc.Layers:
	layer.Lock = False
for b in doc.Blocks:
	if b.Name[0] != "*" and b.Name.find("|") == -1:
		 for ent in b:
			ent.color = ACAD_COLOR.acByBlock
			ent.Layer = "0"
			ent.Lineweight = ACAD_LWEIGHT.acLnWtByBlock
doc.Regen(AcRegenType.acActiveViewport)
как создать AutoCAD.dll:
tlbimp.exe /out:"C:\AutoCAD.dll" "c:\Program Files\Common Files\Autodesk Shared\acax17enu.tlb"
tlbimp.exe - часть ".NET Framework 2.0 Software Development Kit (SDK)", который вы можете загрузить с сайта МС
Красин вне форума  
 
Автор темы   Непрочитано 06.09.2008, 04:36
#3
Красин


 
Регистрация: 05.09.2008
Сообщений: 24


А вот пример по удалению форматирования из многострочного текста (автокад 2008-2009):
Код:
[Выделить все]
import clr
import System
from System.Collections.Generic import List
from Autodesk.AutoCAD.ApplicationServices import *
from  Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.AutoCAD.EditorInput import *
from  Autodesk.AutoCAD.Runtime import * 


doc = Application.DocumentManager.MdiActiveDocument
ed = doc.Editor
db = doc.Database



def MTextUnformat():
	values = List[TypedValue]()
	values.Add(TypedValue(int(DxfCode.Start), "MTEXT"))
	sfilter = SelectionFilter(values.ToArray())
	opts = PromptSelectionOptions()
	opts.MessageForAdding = "выберите многострочный текст"
	res  = ed.GetSelection(opts, sfilter)
	if not res.Status == PromptStatus.OK:
		return
	SS = res.Value
	idarray = SS.GetObjectIds()
	tr = db.TransactionManager.StartTransaction()
	try:
		docLock = doc.LockDocument()
		for id in idarray:
			mtxt = tr.GetObject(id,OpenMode.ForWrite,True)
			mtxt.Contents = mtxt.Text
		tr.Commit()	
	finally:
		tr.Dispose()
		docLock.Dispose()
try:
	MTextUnformat()
except Exception,detail:
	print(detail)
Красин вне форума  
 
Автор темы   Непрочитано 09.09.2008, 21:32
#4
Красин


 
Регистрация: 05.09.2008
Сообщений: 24


В разделе "Готовые программы" я оставил пост с вложением. Во вложении - IronPython + поддержка автокада + некоторые примеры.
Красин вне форума  
 
Автор темы   Непрочитано 10.09.2008, 02:01
#5
Красин


 
Регистрация: 05.09.2008
Сообщений: 24


Прилагаю NET.сборки для версий авткада с 2006 по 2009.




1. Запускаете команду _.netload
2. В этой папке выбираете файл PyAcadDotNet0X.dll, где X – год, соответствующий вашему AutoCAD.
3. Запускаете команду pyfile
4. В диалоге выбираете файл скрипта из папки «примеры»
5. Наслаждаетесь результатом
примечание: если у вас автокад 2007-2009 скрипт можно запускать через Lisp следующим образом (runpyfile "полный путь к файлу скрипта")

Файлы скриптов можно редактировать в бесплатном редакторе Notepad++ (http://notepad-plus.sourceforge.net/ru/site.htm), который обеспечивает подцветку синтаксиса. Обязательно поставьте опцию отображения пробельных символов, так отступы в Python отделяют друг от друга блоки кода.
Пока не существует нормального редактора форм для IronPython. SharpDevelop c PythonBindings не в счет - сыроват.

LISP
Можно получать передавать и получать значения от IronPython следующим образом:
(runpyfile "полный путь к файлу скрипта" аргумент1 аргумент2 ...)
Примеры таких скриптов лежат в папке «примеры» (lisptest.py, lisptest2.py)

COM
Тем, кто программировал Автокад через COM, используя VBA или Delphi, могут делать то же самое и на IronPython:
У NET.api класса Application есть свойство AcadApplication, которое является корнем COM-модел Автокада.
from Autodesk.AutoCAD.ApplicationServices import Application
app = Application.AcadApplication
doc = app.ActiveDocument
print doc.FullName

ссылку на объект AcadDocument можно получить и следующим образом:
doc = Application.DocumentManager.MdiActiveDocument.AcadDocument

Сборки для взаимодействия с COM : AutoCAD.COM.R16.dll (для 2006) AutoCAD.COM.R17.dll (для 2007-2009)
Прямо ссылаться на них не нужно, но их наличие необходимо. Для применения COM модели нужно знать содержимое сборки.
Содержимое сборок можно посмотреть с помощью NetReflector, который бесплатен и доступен для скачивания в интернете. Можно ориентироваться на VBA-справку в справочной системе Автокада.

ObjectARX.NET API
Скачивайте ObjectARX SDK c сайта Autodesk для своей версии Автокада. Там есть примеры для NET.

Ограничения:
Оператор print выдает вместо киррилицы кракозябры ???? ??? . Приходится пользоваться Editor.WriteMessage
Файлы скриптов должны быть в формате UTF8 для корректного отображения киррилицы в командной строке при использовании
оператора print. (Так как исходный файл PyAcadDotNet прилагается, может кто-нибудь это исправит)
Нельзя работать с реакторами ни через COM, ни через NET.
Нельзя наследовать от arx.net классов.
Вложения
Тип файла: zip IronPythonForAcad.zip (1.23 Мб, 208 просмотров)
Красин вне форума  
 
Непрочитано 25.06.2010, 17:18
#6
f4nt0m


 
Регистрация: 09.12.2008
Сообщений: 9


Понемногу стараюсь осваивать Python и хотелось с его помощью программировать в ACADe, подскажите пожалуйста какие книги нужно прочитать или с помощью чего можно этому научиться.
f4nt0m вне форума  
 
Непрочитано 25.06.2010, 17:33
1 | #7
Sync02


 
Регистрация: 07.12.2007
Брест
Сообщений: 243


Посмотри на http://through-the-interface.typepad.com/ относительно программирования под АКАД (там в основном про .NET, но и про IronPython было)
__________________
http://dwg.ru/dnl/5763
Sync02 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > PyAcad.Net - Iron Python для программирования в Автокаде

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищу пример расчета инсоляции FINE Поиск литературы, чертежей, моделей и прочих материалов 266 25.10.2017 18:54
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Предложения по расчетным моделям сооружений aldt Расчетные программы 8 06.07.2009 17:53
Мониторы LCD CRT Разное 94 17.06.2008 10:51
БРЕД СИВОЙ КОБЫЛЫ Kryaker Разное 1876 29.12.2006 23:41