測試結果:
主要思路:選擇一段多段線,使用封裝的jig類進行實時拖動,其原理就是在拖動的時候,確定被拖動的邊,我是選擇離輸入第乙個點最近的邊作為拖動邊,有了這條邊,就能確定需要實時更改的點了,然後當滑鼠拖動的時候,限制拖動方向只能是x軸或者y軸變換,詳細我在**裡都寫了注釋的。不足之處就是選擇之後,我是把原來的物件複製乙份,在刪除了原物件,不知道是不是這個原因,polyline會在選擇之後消失,再次點選又出現了。我試了如果直接以寫的方式操作原對像,cad會報錯,說notopenforwrite,我也不知道這是什麼原因。下面貼出所有的**。
jig操作類:
publicview codeclass
myjig : drawjig
public
void setjigupdate(actionaction)
public
void promptinput(jigpromptpointoptions pointopts, string
msg)
else
if (res.value !=point)
else};}
protected
override
samplerstatus sampler(jigprompts prompts)
return
inputfunc.invoke(prompts);
}protected
override
bool
worlddraw(worlddraw draw)
}return
true
; }
public
promptstatus drag()
}
這個類在我的另一篇jig操作裡做了點介紹的:
命令類:
publicview codeclass
mydrag
list
listl2d = new list();
for (int i = 0; i < pl.numberofvertices - 1; i++)
var pointres = ed.getpoint(new promptpointoptions("
請輸入一地個點:\n
"));
if (pointres.status != promptstatus.ok) return
; vector2d v2d = new vector2d(0, 0
); jigpromptpointoptions jigopts = new
jigpromptpointoptions();
myjig myjig = new
myjig();
myjig.promptinput(jigopts,
"拖動滑鼠");
myjig.jigents.add(plco);
int dir = -1
; myjig.setjigupdate((jig) =>
polyline p = jig.jigents[0] as
polyline;
var pt1 =pointres.value;
var pt2 =jig.point;
var vec = pt2 -pt1;
/*獲取滑鼠拖動方向,主要思路
*當拖動的距離拖動前按下的那個點的
* 距離》1的時候,計算是x軸方向還是y軸方向
* 因為第一次判斷,如果距離過下方向不準確。
* 並且這個方向一確定,就不在更改。
*/if (!isdrag)
else}}
//向右或者向左
if (dir == 0
)
else
//向上或者向下
/** 確定要拖動的邊是選擇距離滑鼠按下的那個點最近的邊
*/double minlength = double
.maxvalue;
int index = -1
;
foreach (var i in enumerable.range(0
, listl2d.count))
}var l2d =listl2d[index];
matrix2d mtx2d =matrix2d.displacement(v2d);
var ptget1 =l2d.startpoint;
var ptget2 =l2d.endpoint;
//實時得到變化的點
var ptstart =ptget1.transformby(mtx2d);
var ptend =ptget2.transformby(mtx2d);
var vecget = ptget2 -ptget1;
//判斷滑鼠移動的方向和被拖動的邊是否是在大致的同一方向
//如果不是,就允許拖動
if (dir == 0 && (math.abs(vecget.x) < math.abs(vecget.y)) ||dir == 1 && (math.abs(vecget.x) >math.abs(vecget.y)))
if (index + 1 == 0
)
if (index == p.numberofvertices - 1
)
if (index + 1 == p.numberofvertices - 1
) }}
});if (myjig.drag() !=promptstatus.ok)
isdrag = false
;
//加入到模型空間
myjig.jigents.tospace();
myjig.jigents.foreach(a =>a.dispose());}}
AutoCAD進行二次開發
本文基於autocad 2006新推出的.net api為工具,介紹了在.net平台下對autocad進行二次開發的技術,並與目前常用的vba objectarx作了對比。同時討論了如何彌補.net api某些不足的功能。當前autocad的二次開發工具主要有 visuallisp vba和obje...
AutoCAD二次開發的好處
autocad二次開發的好處 首先,autocad自身的功能就很強大,對於一般的平面製圖 比如建築 結構方面 不使用任何第三方的軟體,僅憑 autocad 自帶的基本命令,就可以完成。但如果這樣的話,cad製圖就是一件很枯燥乏味 效率低下的事情,比手工製圖強不到 去。autocad 的高明之處就在於...
用C 進行AutoCAD的二次開發
在上一次的例子中我是通過引用autocad 2004 type library來進行c 與autocad之間的通訊,但這種方法存在兩個致命的缺點。第乙個缺點是每次除錯程式的時候c 都要重新啟動autocad,如果除錯的次數非常多 比如跟蹤錯誤然後除錯 那麼程式設計的效率就很低,因為啟動一次cad還是...