在 C 中复制现有的关联图案填充#
我需要创建与给定图案填充相同的图案填充(使用C#)。在实际情况中,这是在不同的计算机上的不同进程中完成的,因此我不能使用剪贴板、复制命令等-我需要读取对象的属性并基于这些属性重新创建一个新实例我已经在这里发布了一个相关问题:(链接仅供参考-无需通读,我会让这篇文章不言自明)
// option 1: add the hatch loop as it is in the original hatch.
// Problem: call to AppendLoop throws eInvalidInput
using ( var boundaryColl = new ObjectIdCollection( associatedObjectIds ) ) {
h.AppendLoop( ltype, boundaryColl );
}
我还尝试将所有边界添加为单独的循环(请参阅所附代码,第89-99行):
// option 2: add each boundary object as a separate loop
// ( as in the second code sample in http://www.theswamp.org/index.php?topic=20832.msg253807#msg253807 )
// Problem: the hatch is created in the wrong place
using ( var boundaryColl = new ObjectIdCollection() ) {
foreach ( var oid in associatedObjectIds ) {
boundaryColl.Clear();
boundaryColl.Add( oid );
h.AppendLoop( ltype, boundaryColl );
}
}
这种方法的问题在于,图案填充是在给定对象的错误交点处创建的
随附的是一张图纸和代码,可轻松重现问题。下面是操作方法:
*在提供的源代码中注释出选项1或选项2(您可以通过搜索例如“选项1”轻松找到它们),具体取决于您希望再现的给定问题
*编译给定的源代码并将其加载到AutoCAD,以使其中定义的命令可用
*。打开所附的图形(hatch_with_CIRCAL_boundary.dwg)
*选择矩形内不与任何其他对象相交的图案填充,然后运行命令NSASSOCHATCH(调用提供的代码)。这在选项1和选项2代码中都可以正常工作。
因为只有一个边界对象。
*现在,选择圆和矩形的交点处的图案填充。
*在选项1中使用代码会导致从AppendLoop中抛出eInvalidInput。
*在选项2中使用代码会在圆和正方形的错误交点处创建新图案填充。
任何关于如何使用C#成功重建具有多个边界对象的关联图案填充的想法都将受到高度赞赏
我的环境:Windows 7上的AutoCAD 2015 64位
**** Hidden Message ***** 该图形中似乎有多代图案填充…
因为您在“不同计算机上的不同过程”上执行此过程,您是否考虑过简单地编写选定实体的DXF,然后将DXF读取到控制图形中
我想,文档命名将取决于您的工作流程。
感谢您的回复。
我考虑过这种方法,但由于几个原因,这似乎不可行。首先,我需要跟踪图形中所有对象的创建和更改。通过创建小的dxf文件来做到这一点会变得很困难(例如,一旦发生更改,要从当前图形中删除什么),并且我认为数十万个实体的性能会变得非常糟糕。
所以我相信我真的需要一种程序化的方式来重现一个联想的舱口。最好在C#中,但C++也很好。
以下是我正在开发的应用程序实际功能的简要概述:
http://neromsoft.com/nsd.htm
以下是我在分析此案例时想出的一些更多信息:
有问题的孵化应该是一个相当基本的关联孵化。只需绘制两个相交的对象,例如圆,正方形或两者,运行H(=填充)命令并在交叉点内单击即可创建它。其中一些可以在附着的图形中找到,但是在任何图形中生成它们都是微不足道的。
像这样的图案填充包含的单个循环具有这样的数据,我无法弄清楚如何使用当前的AutoCAD C#API重现它。该循环包含一条折线(循环。IsPolyline == true, HatchLoopTypes.Polyline 在其类型中标记 on) 和关联的实体。循环的类型是 HatchLoopTypes.Derived |HatchLoopTypes.Polyline |HatchLoopTypes.External,其中前两个仅相对于折线有意义,最后一个与数据库驻留边界实体相关。
Hatch 类包含 AppendLoop 的重载,用于追加折线循环 (Hatch.AppendLoop(HatchLoopTypes loopTypeType,Point2dCollection 顶点Collection,DoubleCollection bulgeCollection))或具有定义边界的 db 驻留实体的循环 (Hatch.AppendLoop(HatchLoopTypes loopTypeType,ObjectIdCollection dbObjIds)),但对于同一循环,不能同时两者。似乎没有修改现有循环的方法。
将折线和边界实体放在同一个循环中并不重要,即使环数和/或其循环类型不同,我也会满足于创建一个外观和行为与原始形状相同的剖面线。
到目前为止,我失败了。我已经发布了只是将边界实体添加为单独循环的代码(将它们一起添加到单个循环中都会给出eInvalidInput,无论我是提供HatchLoopTypes.Default还是HatchLoopTypes。外部作为类型,其他类型值在这里似乎没有意义)。我还尝试在实体定义的循环之前或之后添加从原始循环读取的折线作为单独的循环:
var loop = originalHatch.GetLoopAt( i );
var pline = loop.Polyline;
if ( pline != null ) {
Debug.Assert( loop.IsPolyline );
// pline.
var bvs = pline.Cast();
Point2dCollection vertexCollection = new Point2dCollection( bvs.Select( bv => bv.Vertex ).ToArray() );
DoubleCollection bulgeCollection = new DoubleCollection( bvs.Select( bv => bv.Bulge ).ToArray() );
h.AppendLoop( HatchLoopTypes.Outermost | HatchLoopTypes.Polyline | HatchLoopTypes.Derived, vertexCollection, bulgeCollection );
}
这似乎对最终结果没有任何影响。
请澄清这一过程
在不同的计算机上执行不同的过程?…我想这可能是基于云的
我需要读取对象的属性??…那他们怎么办?所有物体
并基于这些重新创建一个新实例。? 怎样日期是如何存储的?数据是如何在计算机之间传输的?您是如何创建实例的
您的目标是创建一个伪多用户系统吗
使用外部参照是否可以巧妙地实现您想要的结果?
好的,我看了一下网站页面。
根据该网站,你已经可以这样做了
祝你好运申请。
可以这样想。
将它们发送到服务器,服务器将它们保存到数据库并将其广播到其他客户端。对于所有对象,是的,但是我目前试图解决的问题是关联舱口。
当客户端 autocad 在图形中进行更改时,将向服务器发送有关此内容的消息。服务器将消息广播给感兴趣的客户端(即打开所述图形的客户端),因此客户端 autocad 收到有关图形更改的消息(例如,创建、修改或删除实体)并采取相应的操作。数据存储在中央数据库中。客户端不直接相互通信,而是与中继消息的服务器通信。
这些消息包含有关对象属性的必要信息,以便客户端执行更改。
创建、修改和删除是使用 AutoCAD C# API 完成的。
不是伪系统,而是真正的多用户系统。
在某种程度上,是的,但不是一路走来。
我还没有详细查看那里的信息,但它应该说我们还没有完全到达那里,即缺少对某些对象类型的支持。如果没有,我将不得不与负责网站内容的人讨论它。
我想将此线程中的讨论保留在与所呈现的问题相关的内容上,即使用AutoCAD C#或C++API重新创建关联舱口。如果您对我们应用程序的细节感兴趣,我将很乐意回答您的问题,但更愿意在私人消息/电子邮件中这样做,以免使此线程混乱。
属性数据采取什么形式?
即:是DXF转储吗
如果不是,是什么?
我只对解决技术问题感兴趣。
要做到这一点,所有相关标准都需要可用。其他任何事情都是浪费时间和精力。
该消息不是DXF转储-它包含对象相关属性的值(如字符串、布尔值、双精度值等以及相同属性的数组)。举一个非常简单的例子,对于一条线,它包含起点和终点的坐标(+所有实体共有的特性,如颜色)。提到的点不是任何autocad特定的格式,而是一组双精度点。使用AutoCAD C#API从对象读取特性值,例如,使用直线读取直线的起点。StartPoint属性(然后转换为要传输的双数组,因为消息本身中没有使用AutoCAD特定的数据类型)
因此,关于创建点的消息可以被认为如下所示:
{
:operation:create
:type :point
:drawing-id xxxx
:object-id yyyy // this is a GUID not AutoCAD ObjectId as that is not globally unique
:start-point
:end-point
}
图案填充的数据自然要复杂得多,但想法是一样的。
听起来好像你需要定义容器…或容器选项
就个人而言,我会将您自己的包装器放在图案填充的DXF数据周围
dxf代表图形交换格式
它也应该是相对可靠的。
页:
[1]
2