明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1924|回复: 4

[【PyCAD】] [PyCad] 属性块动态块操作,读取Excel

  [复制链接]
发表于 2023-2-12 12:07:56 | 显示全部楼层 |阅读模式
本帖最后由 枫叶棋语 于 2023-2-12 12:23 编辑


# -*- coding: utf-8 -*
import re
import clr
from pycad.runtime import *
from pycad.system import *
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import Clipboard
from Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.AutoCAD.Geometry import *
from Autodesk.AutoCAD.EditorInput import *
from pycad.runtime.edx import *
import System
clr.ImportExtensions(System.Linq)


# COM调用函数
def GetOrCreateCOMSession(progid):
    try:
        from System.Runtime.InteropServices import Marshal
        return Marshal.GetActiveObject(progid)
    except:
        try:
            from System import Type, Activator
            t = Type.GetTypeFromProgID(progid)
            return Activator.CreateInstance(t)
        except: pass



def DynamicBlockreferenceOperate(tr,blockref=BlockReference,name=str,width=float,deepth=float):                 
    DynamicProperty=blockref.DynamicBlockReferencePropertyCollection
    atts=blockref.AttributeCollection
    for Property in DynamicProperty:
        if Property.PropertyName=="width": Property.Value=float(width)
        if Property.PropertyName=="deepth": Property.Value=float(deepth)
    for attid in atts :
        attobj=tr.getobject(attid,OpenMode().ForWrite)
        if attobj.Tag == r'配电柜编号':
            attobj.TextString=name

def ReadRanges():
    ExcelApp=GetOrCreateCOMSession("Excel.Application")
    SelectedRanges=ExcelApp.Selection
    cols=SelectedRanges.Columns.Count
    rows=SelectedRanges.Rows.Count
    rowlist=list()
    collist=list()
    for row in range(rows):
        rng=SelectedRanges[row+1,1]
        if not(rng.EntireColumn.Hidden or rng.EntireRow.Hidden):
            rowlist.append(row+1)
    for col in range(cols):
        rng=SelectedRanges[1,col+1]
        if not(rng.EntireColumn.Hidden or rng.EntireRow.Hidden):
            collist.append(col+1)   
    arr=System.Array.CreateInstance(str,len(rowlist),len(collist))
    for i in range(len(rowlist)):
        for j in range(len(collist)):
            arr[i,j]= str(SelectedRanges[rowlist,collist[j]].Value2)   
    return arr
            # if not(rng.EntireColumn.Hidden or rng.EntireRow.Hidden or rng.Value2==None):               
    #         dictfinal[str(SelectedRanges[row,1].Value2)]={"width":str(SelectedRanges[row,2].Value2),"deepth":str(SelectedRanges[row,3].Value2)}
    # return dictfinal
def ReadAtt(tr,blockref=BlockReference):                 
    atts=blockref.AttributeCollection
    for attid in atts :
        attobj=tr.getobject(attid,OpenMode().ForWrite)
        if attobj.Tag == r'配电柜编号':
            value=attobj.TextString            
    return value   


@command(flags=acrx.CommandFlags.UsePickSet)
def atte(doc):

    # 对Excel内容排序
    # ExcelApp=GetOrCreateCOMSession("Excel.Application")
    # SelectedRanges=ExcelApp.Selection
    # rnglist=list()
    # for rng in SelectedRanges:
    #     if not(rng.EntireColumn.Hidden or rng.EntireRow.Hidden or rng.Value2==None):
    #             rnglist.append(rng)
    # ranges=rnglist.OrderBy(lambda x: x.Row).ThenBy(lambda x: x.Column)
    with dbtrans(doc) as tr:
        res=edx.ssget(mode=':A',filters=(0,'*insert'))
        if (not res.ok()) and (len(res.value)) : return
        ids= tuple(res)
        arr=ReadRanges()
        rows= arr.GetLength(0)
        blocks=map(lambda x:tr.getobject(x,OpenMode().ForWrite) ,ids)
        for blockref,row in zip(blocks,range(rows)):
            DynamicBlockreferenceOperate(tr,blockref,arr[row,0],arr[row,1],arr[row,2])











发表于 2023-2-12 15:55:52 | 显示全部楼层
感谢大神分享示例,学习学习。
发表于 2023-2-12 21:58:12 | 显示全部楼层
想请教一下,如何在 数据库中取出一个属性块,并赋予其初始的属性值呢?而不是修改 选中的属性块。
发表于 2023-2-13 10:05:05 | 显示全部楼层

感谢大神分享示例,学习学习。
发表于 2023-4-11 17:06:46 | 显示全部楼层
没看明白是做什么的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 04:44 , Processed in 0.175193 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表