AutoCad 二次開發 Jig操作之牆塊的拖動

2022-01-11 21:35:25 字數 3118 閱讀 9212

測試結果:

主要思路:選擇一段多段線,使用封裝的jig類進行實時拖動,其原理就是在拖動的時候,確定被拖動的邊,我是選擇離輸入第乙個點最近的邊作為拖動邊,有了這條邊,就能確定需要實時更改的點了,然後當滑鼠拖動的時候,限制拖動方向只能是x軸或者y軸變換,詳細我在**裡都寫了注釋的。不足之處就是選擇之後,我是把原來的物件複製乙份,在刪除了原物件,不知道是不是這個原因,polyline會在選擇之後消失,再次點選又出現了。我試了如果直接以寫的方式操作原對像,cad會報錯,說notopenforwrite,我也不知道這是什麼原因。下面貼出所有的**。

jig操作類:

public

class

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()

}

view code

這個類在我的另一篇jig操作裡做了點介紹的:

命令類:

public

class

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());}}

view code

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還是...