CAD .NET是一款在CAD領域被普遍應用的控件,能夠快速準確的閱讀DWG和DXF文件,而且經過Windows GDI+方法繪製件,支持多種文件格式,包括DWG、DXF、Gerber、光柵圖像等,並支持部分編輯功能。 接下來咱們將以問答形式爲你們解決在使用CAD .NET時所遇到的一些問題,該系列連載但願能夠給你們一些幫助和參考。bash
一:SelectExt()的問題函數
問:在將表單v11更新爲v12後,我仍然面臨幾個問題,其中大多數與選擇有關。我正在使用SelectExt()函數,該函數應該在給定點返回所選實體,此函數不返回實體。設置CADSelector.UseShiftToAddSelected = True將返回實體,但也將容許屢次選擇,這是不須要的。使用Select()而不是SelectExt()返回true,兩個函數不該該相同嗎?ui
我對這個問題作了進一步考慮了一下。有一個名爲clearPrevSelected(bool)的參數,在v11中:將值設置爲true將取消選擇其餘實體並選擇新實體;在v12中:將值設置爲true將不會取消選擇除選擇已選擇的實體以外的任何實體。若是要選擇未選擇的實體,則此函數將返回null。spa
爲何param仍然被稱爲clearPrevSelected,但不會像之前的版本那樣?此參數如今肯定是否要選擇或取消選擇實體,而不是取消選擇其餘實體。code
另一個問題:刪除實體選擇的首選方法是什麼?我要清除全部選擇,但清除所選實體列表不會更新圖形。ClearSelection()將刪除選擇(並刪除集合中的實體)但標記仍然存在,所以我也使用ClearMarkers()。但感受不對,若是咱們只想從列表中刪除實體,這也不會起做用。對象
答:在v12中,CADSelector.SelectExt()方法行爲取決於所述的CADSelector.UseShiftToAddSelected屬性值。方法的第三個參數(clearPrevSelection)實際上採用Shift鍵狀態(按下並保持或未按下)。 若是不須要多項選擇,你應該執行如下操做:get
設置CADSelector.UseShiftToAddSelected = True,以便用戶必須按住Shift鍵才能將新對象添加到選擇集。 經過將clearPrevSelection值設置爲False,禁止在SelectExt()方法中使用Shift鍵: 參見如下代碼:string
Me.cadImage.SelectExt(e.X, e.Y, False, True)
複製代碼
要經過一次調用清除SelectedEntities和Markers集合,請使用CADImage.Selector.UndoSelect()方法。it
二:在DXF中保存CADInsert不起做用io
問:我在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)只是舉的一個例子。
未完待續~