CAD控件CAD .NET问题解答集锦(连载一)

栏目: ASP.NET · 发布时间: 5年前

内容简介:CAD .NET是一款在CAD领域被广泛应用的控件,可以快速准确的阅读DWG和DXF文件,并且通过Windows GDI+方法绘制件,支持多种文件格式,包括DWG、DXF、Gerber、光栅图像等,并支持部分编辑功能。 接下来我们将以问答形式为大家解决在使用CAD .NET时所遇到的一些问题,该系列连载希望可以给大家一些帮助和参考。问:在将表单v11更新为v12后,我仍然面临几个问题,其中大多数与选择有关。我正在使用SelectExt()函数,该函数应该在给定点返回所选实体,此函数不返回实体。设置CADS

CAD .NET是一款在CAD领域被广泛应用的控件,可以快速准确的阅读DWG和DXF文件,并且通过Windows GDI+方法绘制件,支持多种文件格式,包括DWG、DXF、Gerber、光栅图像等,并支持部分编辑功能。 接下来我们将以问答形式为大家解决在使用CAD .NET时所遇到的一些问题,该系列连载希望可以给大家一些帮助和参考。

一:SelectExt()的问题

问:在将表单v11更新为v12后,我仍然面临几个问题,其中大多数与选择有关。我正在使用SelectExt()函数,该函数应该在给定点返回所选实体,此函数不返回实体。设置CADSelector.UseShiftToAddSelected = True将返回实体,但也将允许多次选择,这是不需要的。使用Select()而不是SelectExt()返回true,两个函数不应该相同吗?

我对这个问题做了进一步考虑了一下。有一个名为clearPrevSelected(bool)的参数,在v11中:将值设置为true将取消选择其他实体并选择新实体;在v12中:将值设置为true将不会取消选择除选择已选择的实体之外的任何实体。如果要选择未选择的实体,则此函数将返回null。

为什么param仍然被称为clearPrevSelected,但不会像以前的版本那样?此参数现在确定是否要选择或取消选择实体,而不是取消选择其他实体。

另外一个问题:删除实体选择的首选方法是什么?我要清除所有选择,但清除所选实体列表不会更新图形。ClearSelection()将删除选择(并删除集合中的实体)但标记仍然存在,因此我也使用ClearMarkers()。但感觉不对,如果我们只想从列表中删除实体,这也不会起作用。

答:在v12中,CADSelector.SelectExt()方法行为取决于所述的CADSelector.UseShiftToAddSelected属性值。方法的第三个参数(clearPrevSelection)实际上采用Shift键状态(按下并保持或未按下)。 如果不需要多项选择,你应该执行以下操作:

设置CADSelector.UseShiftToAddSelected = True,以便用户必须按住Shift键才能将新对象添加到选择集。 通过将clearPrevSelection值设置为False,禁止在SelectExt()方法中使用Shift键: 参见以下代码:

Me.cadImage.SelectExt(e.X, e.Y, False, True)
复制代码

要通过一次调用清除SelectedEntities和Markers集合,请使用CADImage.Selector.UndoSelect()方法。

二:在DXF中保存CADInsert不起作用

问:我在CADBlock中添加了几个CADPolylines,最后一个我将它添加到CADInsert中,我控制了CADEditorControl.Image,但是,当我想以DXF格式保存存储在CADInsert中的元素时,它不存储元素也不是CADInsert。

答:元素(给定案例中的CADPolylines)实际存储在CADBlock中,而不是CADInsert中。CADInsert只是通过CADInsert.Block属性引用CADBlock。你能否发一下创建CADBlock和CADInsert的代码,并将这些对象添加到CADEditorControl.Image中?我会检查一下。 :代码如下:

private bool PlaceEntity(CADEntity aEntity)
{
    return PlaceEntity(aEntity, "");
}
 
private bool PlaceEntity(CADEntity aEntity, string aLayoutName)
{
    CADLayout vLayout;
    if (aLayoutName == "")
        vLayout = editor.Image.Layouts[0];
    else
        vLayout = editor.Image.Converter.LayoutByName(aLayoutName);
 
    if (vLayout == null) return false;
 
    editor.Image.Converter.Loads(aEntity);
    vLayout.AddEntity(aEntity);
 
    return true;
}
 
private void DrawDoriArea(DPoint point)
{
    CADBlock block = new CADBlock();
    block.Name = "blockDoriArea";
 
    block.AddEntity(DrawCamera(point));
    block.AddEntity(DrawLens(point));
    block.AddEntity(DrawIdentificationArea(point));
    block.AddEntity(DrawRecognitionArea(point));
    block.AddEntity(DrawObservationArea(point));
    block.AddEntity(DrawDetectionArea(point));
    block.AddEntity(DrawArc(point));
 
    CADInsert insert = new CADInsert();
    insert.Block = block;
 
    if (!PlaceEntity(insert))
        editor.Image.Converter.GetSection(ConvSection.Blocks).RemoveEntityByName("blockDoriArea");
}
复制代码

答:你的代码中存在两个问题:

1)你没有将CADBlock添加到BLOCKS部分,缺少以下代码:

private void AddEntToSection(ConvSection aSection, CADEntity aEntity)
{
    editor.Image.Converter.Loads(aEntity);
    editor.Image.Converter.GetSection(aSection).AddEntity(aEntity);
}
 
    ...
     
    CADBlock block = new CADBlock();
    block.Name = "blockDoriArea";
    AddEntToSection(ConvSection.Blocks, block);
复制代码

2)CADInsert必须有插入点,所以缺少以下代码:

insert.Point = new DPoint(0, 0, 0);
复制代码

问:这一点都是写成(0,0,0)吗?

答:不,你可以使用任何(X,Y,Z)值,具体取决于你要放置CADInsert对象的位置。(0,0,0)只是举的一个例子。

未完待续~


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

文明之光(第二册)

文明之光(第二册)

吴军 / 人民邮电出版社 / 2014-6 / 59.00元

【《文明之光》系列荣获由中宣部、中国图书评论学会和中央电视台联合推选的2014“中国好书”奖】 吴军博士从对人类文明产生了重大影响却在过去被忽略的历史故事里,选择了有意思的几十个片段特写,以人文和科技、经济结合的视角,有机地展现了一幅人类文明发展的宏大画卷。 《文明之光 》系列大致按照从地球诞生到近现代的顺序讲述了人类文明进程的各个阶段,每个章节相对独立,全景式地展现了人类文明发展历程......一起来看看 《文明之光(第二册)》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具