Код на Python для вставки блока в точку со смещением относительно координат Мтекста

Первая программа берет координаты у выделенного Мтекста и блоков и вычисляет дельту между координатами вставки Мтекста и блоков. Результаты пишет в файл.

 

# coding: utf-8
import System
app = System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application")
aDoc = app.ActiveDocument
mSp = aDoc.ModelSpace
sset = aDoc.PickfirstSelectionSet


text = []
block1=[]
point=[]
block3=[]
block4=[]


for i in sset:	
	if i.ObjectName == 'AcDbMText':
		text=i.insertionPoint
		print 'точка вставки текста',text		
		
for i in sset:		
	if i.ObjectName == 'AcDbBlockReference':		
		block1=i.insertionPoint
		print 'точка вставки блока',block1
		print 'дельта х', text[0]-block1[0]
		point.append(text[0]-block1[0])
		print 'дельта y', text[1]-block1[1]
		point.append(text[1]-block1[1])
		
print point

f = open( 'POINT.txt', 'wr' )
for i in iter(point):
	print i
	f.write(str(i))
	f.write(' ')
f.close()
	
	

Вторая программа читает данные из файла и вставляет столько же блоков с теми же координатами относительно выделенного МТекста

# coding: utf-8
import System
app = System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application")
aDoc = app.ActiveDocument
mSp = aDoc.ModelSpace
sset = aDoc.PickfirstSelectionSet


def ptA(p,x1,y1):
	return System.Array[float]([p[0], p[1], p[2], p[0]+x1, p[1]+y1, p[2]])
#print elems[0].ObjectName
#print elems[0].Layer
#print dir ()
text = []
block1=[]
point=[]
block3=[]
block4=[]
#print mSp.Count
n = int(1)

		
		
		
# for i in sset:		
	# if i.ObjectName == 'AcDbBlockReference':
		# print i.Name
		# block1=i.insertionPoint
		# print 'точка вставки блока',block1
		# print 'дельта х', text[0]-block1[0]
		# point.append(text[0]-block1[0])
		# print 'дельта y', text[1]-block1[1]
		# point.append(text[1]-block1[1])
		# n=n+1
# print point

#sset1=aDoc.SelectionSets.Add
#returnObj = aDoc.Utility.GetEntity(sset1, 'Select objects')

f = open( 'POINT.txt', 'r' )
lst = f.readlines()
#print lst
# for i in iter(ftext):
	# print i
	# f.write(str(i))
	# f.write(' ')
f.close()
with open( 'POINT.txt', 'r' ) as file:
    string = file.read()
#del lst[0]
#print lst
lst = [float(n) for n in string.split()] 
print lst	

#print lst[0]
for i in sset:
	#print i.Name
	if i.ObjectName == 'AcDbMText':
		#print dir(i)
		text=i.insertionPoint
		#print 'точка вставки текста',text
		#print int((int(i.TextString[0])/2))+1
		text[0]=text[0]-lst[0]
		#print len(lst)
		n = 1
		print round(7/2)
		delta=lst[1]-lst[3]
		text[1]=text[1]-lst[7]
		print text[1]
		for i in range(1,int(i.TextString[0])+1,2):			
			print i
			print n
			print float(lst[n*2-1])
			text[1]=text[1]-delta
			mSp.InsertBlock(text, 'РОН-2',1,1,1,0,[])	
			#n=n+1
			print text[1]


			

Простой код на Python, позволяющий заменить блок в чертеже AutoCAD

Работает в IronPython 2.7 c COM API. Код заменяет блок «РОН-2» на блок «радиорозетка» со смещением точки вставки.

# coding: utf-8
import System
app = System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application")
aDoc = app.ActiveDocument
mSp = aDoc.ModelSpace
sset = aDoc.PickfirstSelectionSet
text = []
for i in sset:
	if i.ObjectName == 'AcDbBlockReference':
		if i.Name == 'РОН-2':
			text=i.insertionPoint
			print text
			text[0]=text[0]-3.0088
			text[1]=text[1]+2.9133
			mSp.InsertBlock(text, 'радиорозетка',1,1,1,0,[])			
			i.Erase())