明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2781|回复: 8

更改过的DWG中保留图元的唯一且不变的特性是什么呢

[复制链接]
发表于 2011-9-29 20:31 | 显示全部楼层 |阅读模式
1明经币

       我编写一个小程序,把DWG图转换成DWF格式,点击图形中的图元(比如一个圆),然后通过Autodesk Design Review 的API查得该图元的ID号,再从我的ACCESS数据库中查找到与该ID号关联的信息(我事先存好该ID号及其关联的信息),再在另一个地方对这个图元进行详细说明(比如显示出文本:“这是一个圆”)。

       但是我的DWG图是需要经常修改的,而且我发现修改并保存过后的各个图元的ID号会改变,
这意味着我需要使用另外一个信息,是图元唯一的身份标识,并且对DWG图进行修改(不对需要详细解释的图元进行修改)后它不会。

        那么更改过的DWG中保留图元的唯一且不变的特性是什么呢?
        换句话说,我需要知道我的图形修改过后,那些不变保留下来的图元,后来它的ID变成什么啦?

           我不会CAD编程, 请求.NET编程达人给些代码完成,将不胜感谢!

最佳答案

查看完整内容

用 handle 不用图元的ID
发表于 2011-9-29 20:31 | 显示全部楼层
用 handle 不用图元的ID
回复

使用道具 举报

 楼主| 发表于 2011-9-29 20:37 | 显示全部楼层
得补充一下。我发现修改过改过后的DWG图元ID会变,是通过Autodesk Design Review 的API发现的,实际上在DWG中是否不变,是得实地验证下才行。可是我不会。
回复

使用道具 举报

发表于 2011-9-30 09:44 | 显示全部楼层
根据AutoCAD .NET  Developer‘s Guide中的相关章节,当同时使用.NET API和ActiveX Automation时,如果你定义了一个需要返回一个对象的函数,推荐返回该对象的对象标识(ObjectId)而不是对象本身。更多关于对象标识的信息,可查看“使用对象标识”。但是ObjectID会随着每次AutoCAD打开而发生变化。
Each object contained with in the Database object is assigned several unique ids. The unique ways you can access objects are:
Entity handle
ObjectId
Instance pointer
The most common method is to access an object by its Object Id. Object Ids work well if your projects utilize both COM interop and the managed .NET API. If you create custom AutoLISP functions, you may need to work with entity handles.
所以你可以试试Entity Handle和Instance Pointer吧,祝你好运。

回复

使用道具 举报

 楼主| 发表于 2011-9-30 11:35 | 显示全部楼层
我所使用的Autodesk Design Review 的API,仅提供Object2.ID,以及object.Properties
而Properties仅提供category, type,value,name,units.

这样我仅有两种选择:
第一,原软件继续使用ID,实现对对象的准确选择,这是最好的,那么就需要知道DWG每次转换成DWF文件前ID值的变化,需要通过对象的唯一标识来识别ID值的变化。但我现在还不知道什么才算是对象唯一标识。AutoCAD .NET  Developer‘s Guide中不知在哪一部分,因为对E文不熟。照我想来,对象坐标,如线段的起止点,圆的中心及半径,把这些数据合成起来应该可以算是一个对象的“唯一标识”,但我不知道怎么通过cad.net编程来实现。

第二种方法则是在我的软件中使用object.Properties中Properties.name属性。那么我就需要在DWG中,把所有的图元块化,块命名成我所能掌握的名称,这样不管DWG图怎么修改,我的块名都不会变化。但怎样把所有的图元块化并命名,我也不懂。

各位高人,能不能给些代码启示下,如所需代码不多,可不可帮写写?
如果让我学CAD.NET编程,可能也可实现但肯定花费不少时间,而现在原软件还需要不少精力来完成。
回复

使用道具 举报

发表于 2011-9-30 16:50 | 显示全部楼层
没有捷径,希望你成功
回复

使用道具 举报

发表于 2011-10-13 20:31 | 显示全部楼层
用handle没有错,只要你的图元不删除,其handle永远不会变
回复

使用道具 举报

发表于 2011-10-14 10:37 | 显示全部楼层
板凳网友已经给出答案,为何还没兑现悬赏?
回复

使用道具 举报

 楼主| 发表于 2011-10-16 15:47 | 显示全部楼层
就仅题目而言,确实使用Entity handle 是正确的。
在DWG文件中,不管怎么修改Entity handle 都不会变,在此即兑现悬赏。

但是我的问题实质并未解决,entity handle无法经由ADR的API 中提取!
我需要在DWG中为每个图元存入某个唯一的,且DWG修改不影响到的标识信息,并且这个信息能够经由ADR的api中提取出来。ADR的API可以取得对象的属性,该属性有如下项:name, unit,value,category.

找来找去想来想去有如下办法:
1,ATUTOCAD中代码生成与图元同样数量的材质,材质都一样只是命名不同,然后为每个图元分配唯一的材质名,然后发布到DWF文件中,再经由其API函数提取出来,从找到国外的一些资料上看是可以实现的。怎样创建材质已经找到相关代码。

现在让我抓狂的是:怎样发布DWF文件都不见带有指定的材质。问题应该出在渲染上,也可能出在我所使用的D版AUTOCAD2009。

关于发布在CAD的帮助里有这样一段话。

发布材质

如果已将贴有纹理的材质指定给模型,则可以使用三维 DWF 或三维 DWFx 文件发布这些材质。在图形编辑器中设置的纹理贴图的方向和比例将保留在已发布的三维 DWF 或三维 DWFx 文件中。

对材质发布存在一些限制。

“漫射贴图”通道是唯一得到发布的贴图。如果在材质中使用“不透明度”、“反射”或“凹凸”贴图,则它们将得不到发布。
程序材质(例如木材或大理石)得不到发布。
注意由于 DWF Viewer 与渲染引擎不同,用户可能会在纹理贴图在 DWF Viewer 中的显示方式方面遇到一些偏差。


我没有能够试出来,我没学过渲染,哪位达人给个准确的步骤下好吗?
如果发面成功,在AUTODESK DESIGN REVIEW里点击对象时,对象特性就会显示出材质名来,然后可以通API提取其名称。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 14:01 , Processed in 0.204454 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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