CAD控制元件CAD .NET問題解答集錦(連載一)

Juvien_Huang發表於2018-12-19

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)只是舉的一個例子。

未完待續~

相關文章