乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 70|回复: 5

覆盖,从块引用中读取属性

[复制链接]

7

主题

28

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
56
发表于 2013-5-12 08:34:13 | 显示全部楼层 |阅读模式
我正在努力学习否决权,这些年来我一直在回避的事情
当否决blockreference的DrawableOverrule时,当用户更改属性中的属性引用时,将执行overrule(我没有料到)
对象将显示为打开状态(在本例中为blockreference)以读取其属性,但要从.net访问其AttributeReference,需要一个事务,并且没有一个事务处于活动状态。如何阅读它们
解决方法是为属性引用创建另一个否决权。最佳实践是什么
公共类test2overrule
继承了DrawableOverrule
Const regappname As String=“testap1”
公共共享test2overrulevas作为新的test2overrule
Public Sub New()
”告诉AutoCAD在我们的应用程序名称上进行筛选。
”(这意味着我们的否决权只会被称为
拥有此名称扩展数据的对象上的“
”)
SetXDataFilter(regAppName)
末端接头
将函数WorldDraw(ByVal可绘制为Autodesk.AutoCAD.GraphicsInterface.drawable,ByVal wd可绘制为Autodesk.AutoCAD.GraphicsInterface.WorldDraw)替换为布尔值。
Dim m As BlockReference=TryCast(可绘制,实体)
返回MyBase。WorldDraw(可绘制,wd)
结束函数
将函数SetAttributes(ByVal可绘制为Autodesk.AutoCAD.GraphicsInterface.drawable,ByVal traits可绘制为Autodesk.AutoCAD.GraphicsInterface.DrawableTraits)替换为整数。
Dim m As BlockReference=TryCast(可绘制,实体)
返回MyBase。设置属性(可绘制、特征)
结束函数
结束类

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

2

主题

31

帖子

1

银币

初来乍到

Rank: 1

铜币
39
发表于 2013-5-12 15:43:10 | 显示全部楼层

为什么需要从您的overrule的WorldDraw()中打开属性?
回复

使用道具 举报

7

主题

28

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
56
发表于 2013-5-13 02:59:31 | 显示全部楼层
我真正想要的是:
当用户修改Entity(让我们说-移动块引用)时,然后读取(让我们说位置. y)并用新值更新我的. net对象。
-我还想知道用户是否在块引用中更改了attributereference.text,并阅读它。
-如果他修改了动态块属性,请阅读它。
不确定使用哪个覆盖,但在“移动”的情况下,我希望实时看到它。
如果需要,我可以在这里放一些代码。
到目前为止,我一直在这样做:我挂钩到我感兴趣的每个对象的对象修改事件,当事件触发时,转在. net对象标志上,然后在可能的情况下打开单个事务并批量读取所有展开的对象。
回复

使用道具 举报

7

主题

28

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
56
发表于 2013-5-13 03:30:19 | 显示全部楼层
所以我在这个代码中规划了这样的东西,这是移动的否决,它将更新.NET对象,但我想知道,就像我之前说的:如果dynprop发生了变化,如果attref被挣脱(以及它现在的价值是什么)。我相信要走的路是DrawableOverrule,但不确定。'假设 appname 已经在数据库中注册。
'假设每个实体都有 ent,XData = New ResultBuffer(New TypedValue(DxfCode.ExtendedDataRegAppName, “test”), New TypedValue(DxfCode.ExtendedDataAsciiString, ent.ObjectId.ToString), New TypedValue(DxfCode.ExtendedDataAsciiString, “good”))。
'假设 overruling 对于块引用处于活动状态。

公共课程应用1。
公开共享 mylist1 作为新列表(Myobject1)。
结束类。

公共类 myobject1。
私人_positiony作为双人间。
私有_oid作为对象 Id。

公共财产定位为双倍。
获取。
退货_positiony。
结束获取。
Set(按值作为双精度值)。
_positiony = 值。
端集。
结束属性。

公共属性 oid 作为 ObjectId。
获取。
退货_oid。
结束获取。
Set(ByVal value As ObjectId)。
_oid = 值。
端集。
结束属性。

Public Sub readEnt(ByVal ent as Entity)。
Dim blokref As BlockReference = DirectCast(ent, BlockReference)。
positiony = blokref.位置.Y。
结束子。

结束类。


公共类测试1否决1。
继承转换规则。
公共共享测试1作为新测试的主权1规则1。
公共 regappname As String = “test”。
私有存储为字符串。

公共子新()。
' 告诉 AutoCAD 根据我们的应用程序名称进行筛选。
'(这意味着我们的否决只会被调用。
' 在具有具有此名称的 XData 的对象上)。
SetXDataFilter(regappname)。
结束子。
   。
公共覆盖子转换By(ByVal实体作为实体,。
ByVal 变换为 Matrix3d)。

MyBase.TransformBy(entity, transform)。
如果 checkxdata(entity) 则。
findmyobjectinlist(entity)。
如果结束。
结束子。

公共函数 checkxdata(按值作为实体)作为布尔值。
Dim retval as Boolean = False。
将 xdata Dim as ResultBuffer = ent,GetXDataForApplication(regappname)。
选择“事例 xdata”,AsArray(2).Value.ToString。
案例“好”。
存储 id = xdata,AsArray(1).Value.ToString。
retval = True。
结束选择。
Return retval。
结束功能。

Public Sub findmyobjectinlist(ByVal ent As Entity)。
Dim myobj = From obj1 In app1.mylist1。
其中 obj1.oid.ToString = storedid。
选择 obj1。

如果 myobj.数> 0 然后。
myobj.First.readEnt(ent)。
如果结束。
结束子。
结束类。
回复

使用道具 举报

2

主题

31

帖子

1

银币

初来乍到

Rank: 1

铜币
39
发表于 2013-5-13 23:36:39 | 显示全部楼层
抱歉,您的代码没有传达您的意图(例如,您在“ReadEnt()”中做了什么?)。
我不会评论关于解决问题的想法或伪代码,除非你透露问题本身。
回复

使用道具 举报

2

主题

14

帖子

3

银币

初来乍到

Rank: 1

铜币
22
发表于 2015-8-25 08:08:23 | 显示全部楼层
嗨,
您可以通过事务轻松读取块引用属性。WorldDraw函数仅覆盖所有BlockRefereces。示例读取块属性值并使用wd.Geometry.Text函数显示。您必须为此创建Autodesk.AutoCAD.GraphicsInterface.TextStyle。
Cheers
Veli V.
  1. Public Overrides Function WorldDraw(drawable As Autodesk.AutoCAD.GraphicsInterface.Drawable, wd As Autodesk.AutoCAD.GraphicsInterface.WorldDraw) As Boolean
  2.             Dim oAttrib As AttributeReference = Nothing
  3.             Dim blk As BlockReference = DirectCast(drawable, BlockReference)
  4.             If Not blk Is Nothing Then
  5.                 Dim attCol As AttributeCollection = blk.AttributeCollection
  6.                 Dim attTextPosYDiff As Double = 0.0
  7.                 Dim sAttribTexts As New List(Of String)
  8.                 ed.WriteMessage("BlockReference: " + blk.Name + vbCrLf)
  9.                 If blk.Name.Trim.ToLower = "kltaite" Then
  10.                     Try
  11.                         Using tr As Transaction = HostApplicationServices.WorkingDatabase.TransactionManager.StartOpenCloseTransaction
  12.                             For Each attObjId As ObjectId In attCol
  13.                                 oAttrib = DirectCast(tr.GetObject(attObjId, OpenMode.ForRead), AttributeReference)
  14.                                 'ed.WriteMessage("BlockAttribute: " + oAttrib.Tag + vbCrLf)
  15.                                 sAttribTexts.Add(oAttrib.Tag + " = " + oAttrib.TextString)
  16.                             Next attObjId
  17.                             tr.Commit()
  18.                         End Using
  19.                     Catch ex As Exception
  20.                         Debug.WriteLine("Error while reading block " + blk.Name + " attribute. " + ex.Message)
  21.                         ed.WriteMessage("Error while reading block " + blk.Name + " attribute. " + ex.Message + vbCrLf)
  22.                     End Try
  23.                     If Not sAttribTexts Is Nothing Then
  24.                         For Each sVal As String In sAttribTexts
  25.                             wd.Geometry.Text(New Autodesk.AutoCAD.Geometry.Point3d(blk.Position.X, blk.Position.Y - attTextPosYDiff, blk.Position.Z), _TextNormal, _TextDirect, sVal, True, _style)
  26.                             attTextPosYDiff += 0.5
  27.                         Next sVal
  28.                     End If
  29.                     wd.Geometry.Circle(blk.Position, 1, New Autodesk.AutoCAD.Geometry.Vector3d(0, 0, 1))
  30.                     Using sol3d As New Solid3d()
  31.                         sol3d.CreateSphere(0.2)
  32.                         sol3d.TransformBy(Autodesk.AutoCAD.Geometry.Matrix3d.Displacement(blk.Position - Autodesk.AutoCAD.Geometry.Point3d.Origin))
  33.                         sol3d.WorldDraw(wd)
  34.                     End Using
  35.                 End If
  36.                 sAttribTexts.Clear() : sAttribTexts = Nothing
  37.             End If
  38.             Return MyBase.WorldDraw(drawable, wd)
  39.         End Function
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 00:49 , Processed in 0.205988 second(s), 64 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表