AutoCAD顧問
還沒有註冊嗎...即日起免費註冊,所有最完整的AutoCAD討論、教學及資源都在論壇裡喔~

Join the forum, it's quick and easy

AutoCAD顧問
還沒有註冊嗎...即日起免費註冊,所有最完整的AutoCAD討論、教學及資源都在論壇裡喔~
AutoCAD顧問
Would you like to react to this message? Create an account in a few clicks or log in to continue.
【回帖精華】Offset指令的演算法源碼 Ioaoe110【回帖精華】Offset指令的演算法源碼 2020-310【回帖精華】Offset指令的演算法源碼 Oiu15010【回帖精華】Offset指令的演算法源碼 2020-211【回帖精華】Offset指令的演算法源碼 Ia15010【回帖精華】Offset指令的演算法源碼 Aizyao10【回帖精華】Offset指令的演算法源碼 Uos15010【回帖精華】Offset指令的演算法源碼 BPl3tjj【回帖精華】Offset指令的演算法源碼 Ziao1510
【回帖精華】Offset指令的演算法源碼 Oo-2-110【回帖精華】Offset指令的演算法源碼 Zuoiy_10【回帖精華】Offset指令的演算法源碼 Aizyao11【回帖精華】Offset指令的演算法源碼 Iyb_1510【回帖精華】Offset指令的演算法源碼 Aoe1-111【回帖精華】Offset指令的演算法源碼 Uos15011【回帖精華】Offset指令的演算法源碼 Aoe2da10【回帖精華】Offset指令的演算法源碼 Aoe2da11【回帖精華】Offset指令的演算法源碼 Aoe10

【回帖精華】Offset指令的演算法源碼

+3
明~
judyyai
kevinjyh
7 posters

向下

【回帖精華】Offset指令的演算法源碼 Empty 【回帖精華】Offset指令的演算法源碼

發表 由 kevinjyh 2012-05-11, 16:50

AutoCAD玩了幾年,測量也玩了幾年,甚至用過JavaScript、VB、ExcelVBA寫了不下四、五個版本的
自製測量計算程式,最新的版本,使用了matrix計算來轉換空間座標的方法,但是只能適用於直線段及
圓曲段的線型測量,所以對CAD能對所有線型(甚或手繪線)直接使用Offset指令,即可快速求出需要的
偏移曲線的演算法,一直很感興趣。

我的程式是利用三角函數等等的數學關係來計算需要的線型或座標值,但我在想CAD一定不是用這個方式
,推測可能是用向量字的作法,但英文程度不佳,一直無法Google到所需要的演算法源碼。

不知道這裏有無高手有資源可以提供?
例如:可以幫忙用英文Google?或者擁有CAD之Offset指令的演算法程式碼?

Kevin Shen
kevinjyh
kevinjyh
一般會員
一般會員

文章總數 : 22
年齡 : 54
來自 : 台東
職業 : 營建業
愛好 : 電腦
個性 : 好相處
使用年資 : 5年
使用版本 : 2008
經驗值 : 4623
威望值 : 18
注冊日期 : 2011-12-17
男 雙魚座 狗

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 judyyai 2012-05-17, 22:13

你好~這裡是公開討論場合
請勿在討論區私下留下MAIL (所以將MAIL 清除)

論壇總版規
8.發表文章、回覆及討論問題,以公開透明討論為原則,請勿留下個人信箱、廣告及非法性等相關訊息。

____________________________________________________________________________________
【回帖精華】Offset指令的演算法源碼 Ioaoe110 【回帖精華】Offset指令的演算法源碼 Zuoiy_10 【回帖精華】Offset指令的演算法源碼 2020-211 【回帖精華】Offset指令的演算法源碼 Aizyao11 【回帖精華】Offset指令的演算法源碼 Aoe10
【回帖精華】Offset指令的演算法源碼 Aizyao10 【回帖精華】Offset指令的演算法源碼 BPl3tjj.png 【回帖精華】Offset指令的演算法源碼 Ziao1510 【回帖精華】Offset指令的演算法源碼 Oo-2-110 【回帖精華】Offset指令的演算法源碼 Aoe1-111
judyyai
judyyai
管理顧問
管理顧問

文章總數 : 7782
年齡 : 46
來自 : 台南
職業 : 機械製圖
愛好 : 電腦相關
個性 : think too much...
使用年資 : 10↑
使用版本 : AC2019(開始於2019年底末月)
AutoCAD基礎篇等級 : 10星級
積分 : 393
最佳解答 : 1
經驗值 : 30191
威望值 : 3609
發帖精華 : 2
回帖精華 : 4
注冊日期 : 2008-11-19
2D基礎函授 3D基礎函授 顧問外掛程式 經典問與答讀者 藍鵲2號
2009聚會勳章 串連貼紙成功 女 巨蟹座 蛇

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 kevinjyh 2012-05-18, 09:07

咦~~~我記得沒有留下個人的Email啊~~~大概是習慣動作吧! 三條線

言歸正傳!

去VerySource輸入CAD關鍵字,找到一堆的小型CAD源碼,幾乎
都是用MFC+OpenGL寫的,但還是找不到Offset演算法的源碼!
那網站中,小型Excel的源碼也不少,研究一下,算是對Excel有了更深層的理解。 傻笑

ps:有沒有人對CAD、MFC及EXCEL源碼有興趣的?因為我需要有同好才有動力去鑽研! 頭暈目眩
kevinjyh
kevinjyh
一般會員
一般會員

文章總數 : 22
年齡 : 54
來自 : 台東
職業 : 營建業
愛好 : 電腦
個性 : 好相處
使用年資 : 5年
使用版本 : 2008
經驗值 : 4623
威望值 : 18
注冊日期 : 2011-12-17
男 雙魚座 狗

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 kevinjyh 2012-05-23, 17:28

看到對岸2003年寫了本「Visual C++ CAD應用程序開發技術/王清輝 王彪 編著」
其中使用MFC+OpenGL寫了仿CAD的STLViewer軟體,有點相見恨晚的感覺,
寫得蠻詳盡的!

其實不是想自己重新編寫一套CAD,只是對這個「法拉利」的引擎有著極大的
好奇心,就算當個門外漢,看看引擎基本的運作情形,也是一大樂趣。
kevinjyh
kevinjyh
一般會員
一般會員

文章總數 : 22
年齡 : 54
來自 : 台東
職業 : 營建業
愛好 : 電腦
個性 : 好相處
使用年資 : 5年
使用版本 : 2008
經驗值 : 4623
威望值 : 18
注冊日期 : 2011-12-17
男 雙魚座 狗

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 明~ 2012-05-26, 13:13

這有個源碼,不知對你有沒有幫助~
;;; Offset selected object
;;; O - Object to offset
;;; D - Distance to offset object
;;; P - Point on side of object to offset
;;; Alan J. Thompson, 09.12.09 / 03.25.10
(defun AT:Offset (O D P / _pt p1 p2 c D g)
(setq_pt (lambda (s)
(vlax-curve-getPointAtDist
O
(s (vlax-curve-getDistAtPoint O p1) 0.00001)
)
)
)
(if
(and
(setq p1 (vlax-curve-getclosestpointtoprojection
O
(trans P 1 0)
'(0 0 1)
)
)
(or (setq p2 (setq c (_pt +))) (setq p2 (_pt -)))
(if
(minusp
(- (* (- (car p2) (car p1)) (- (cadr (trans P 1 0)) (cadr p1)))
(* (- (cadr p2) (cadr p1)) (- (car (trans P 1 0)) (car p1)))
) ;_ -
) ;_ minusp
(if (vl-position
(vla-get-objectname O)
'("AcDbLine" "AcDbXline")
)
(setq D (- (abs D)))
(setq D (abs D))
) ;_ if
(if (vl-position
(vla-get-objectname O)
'("AcDbLine" "AcDbXline")
)
(setq D (abs D))
(setq D (- (abs D)))
) ;_ if
) ;_ if
(or c (setq D (- D)))
(not (vl-catch-all-error-p
(setq g (vl-catch-all-apply 'vla-offset (list O D)))
)
)
) ;_ and
(car (vlax-safearray->list (vlax-variant-value g)))
) ;_ if
) ;_ defun


(defun c:Test (/ ss d p)
(and (setq
ss (ssget "_:L" '((0 . "ARC,ELLIPSE,LINE,LWPOLYLINE,SPLINE")))
)
(setq d (getdist "\nDistance: "))
(setq p (getpoint "\nSpecify point: "))
(foreachx (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
(AT:Offset (vlax-ename->vla-object x) d p)
) ;_ foreach
) ;_ and
) ;_ defun


明~
明~
高級會員
高級會員

文章總數 : 307
年齡 : 44
來自 : 彰化
職業 : 機械
愛好 : 打球 騎車 健行 音樂 電影 (說不完...)
個性 : 不與人爭
使用年資 : 從學生時代接觸到現在(工作中不一定使用)
使用版本 : 2004和2008
積分 : 17
經驗值 : 6956
威望值 : 667
注冊日期 : 2009-12-24
藍鵲292號
男 雙魚座 猴

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 kevinjyh 2012-05-26, 22:31

哈!~~~Lisp語言… 火冒三丈
看得有點無頭緒,十餘年沒用過了,慢慢回想 & google才能看懂一些皮毛,
但是看到vlax-curve-getPointAtDist及vlax-curve-getclosestpointtoprojection
兩個函數,就知道跟我的想法非常接近,雖然尚未全部看懂,可是與我先前使用
Excel內部函數設計的公路圓曲及直線支距法(就是offset)應該是採用類似的演算法。

無論如何,感謝「明~」兄的幫忙……


我上兩樓建議的「王清輝 王彪」的書,我已瀏覽過一遍……算是對
CAD的基本架構有了粗淺的暸解。


若以個人不知地厚天高的評論,撇開Documnet/View架構、執行時期型別資訊
(Runtime Type Information,RTTI)、OOP的Polymorphism及virtual function
…等等,MFC或其它大型Application Framework均已幫我們架構完成後,CAD就
只剩Business Logic Tier及螢幕顯示的環節,其中螢幕顯示部份,以我個人
Google OpenSource CAD得到,大部份軟體均使用OpenGL來支援。

以上粗論,不知有無人可以指點一二。 三條線2
kevinjyh
kevinjyh
一般會員
一般會員

文章總數 : 22
年齡 : 54
來自 : 台東
職業 : 營建業
愛好 : 電腦
個性 : 好相處
使用年資 : 5年
使用版本 : 2008
經驗值 : 4623
威望值 : 18
注冊日期 : 2011-12-17
男 雙魚座 狗

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 nobody 2012-10-15, 16:40

kevinjyh 寫到:若以個人不知地厚天高的評論,撇開Documnet/View架構、執行時期型別資訊
(Runtime Type Information,RTTI)、OOP的Polymorphism及virtual function
…等等,MFC或其它大型Application Framework均已幫我們架構完成後,CAD就
只剩Business Logic Tier及螢幕顯示的環節,其中螢幕顯示部份,以我個人
Google OpenSource CAD得到,大部份軟體均使用OpenGL來支援。
上述這段話我怎麼看就怎麼怪:
1、的確,Documnet/View是MFC能升格為Application Framework的主因,但是實際上MFC是採用Documnet/View/Frame架構把一個應用程式所需的『資料處理與顯示』的函式空殼先設計好,這使得程式開發者只須花心思在其相關領域之程式撰寫,其他瑣事一概不管,這就是MFC能夠格成為Application Framework的原因。
2、你指的RTTI(Runtime Type Information)是用於C++中,而MFC則使用自己沿用多年的RTTI(Runtime Type Identification:動態型別辨識)。
3、多型(polymorphism)的目的是讓處理基礎類別物件的程式碼能繼續處理衍生類別物件,這種性質須靠虛擬函式(virtual function)才能完成,而虛擬函式為類別的成員函式,一般而言,類別的成員變數由成員函式來處理,而說到成員變數就涉及類別的封裝(encapsulation)與繼承(inheritance)。因此,要談OOP應該包含:類別、封裝、繼承、虛擬函式、多型。
4、若是以MFC開發一套CAD,在螢幕顯示這部份以OpenGL來處理這絕對沒問題,不過OpenGL會與Documnet/View/Frame架構結合在一起(尤其是View這部份更是緊密結合),而這一結合連帶也會將上述 2、3兩項關聯進來,因此你不應把它們拆(撇)開來看。
5、我們談的是視窗程式。而視窗程式是採用事件驅動的模型,換句話說,作業系統會負責把事件以訊息形式送到視窗應用程式來處理。其實上面提到OpenGL與View結合就是會使用到訊息處理函式。因此你應該也把訊息處理加入考量中。

看到這裡應該有人還是不了解上面所談的,若是能有例子那麼將有助於理解。所幸AutoCAD就是MFC開發出來的(這表示AutoCAD符合上述五項敘述),而在AutoCAD內透過ObjectARX我們便能以MFC來作AutoCAD的二次開發。接下來我會挑一些討論的問題來當例子,這應該會是最符合實際用途的。

另外,因為會參考到『大家一起來作伙-請問大家對於GROUP都作何使用』這篇貼文,為了方便我稱它為『參考文』。

《一、ObjectARX的基本應用》
這一章談的都是AutoCAD本身的內容,所以我沒有準備圖片,不過,後面的章節我會藉由一些圖片來讓你看到一個不太一樣的AutoCAD。

(1)
kevinjyh 寫到:AutoCAD玩了幾年,測量也玩了幾年,甚至用過JavaScript、VB、ExcelVBA寫了不下四、五個版本的
自製測量計算程式,最新的版本,使用了matrix計算來轉換空間座標的方法,但是只能適用於直線段及
圓曲段的線型測量,所以對CAD能對所有線型(甚或手繪線)直接使用Offset指令,即可快速求出需要的
偏移曲線的演算法,一直很感興趣。

我的程式是利用三角函數等等的數學關係來計算需要的線型或座標值,但我在想CAD一定不是用這個方式
,推測可能是用向量字的作法,但英文程度不佳,一直無法Google到所需要的演算法源碼。
以ObjectARX求出需要的偏移曲線之核心程式碼如下:
getClosestPointTo(…);
getFirstDeriv(…);
getOffsetCurves(…);
重點在getOffsetCurves(),這是呼叫ObjectARX API求出偏移曲線。若你在AutoCAD外則必須有自己的演算法:
已知:一點pt,曲線pCurve,偏移距離offDist。
求出pt在pCurve的最近點。求出pCurve在最近點的切線方向。依據pt及切線方向判斷offDist之正負值。由pCurve的起點開始,求出對應的切線方向,再依據含正負號的offDist求出對應於起點的偏移點,依序由pCurve起點增加一小段距離得到一個新點,求出pCurve在新點的切線方向,再求出對應起點的偏移點,重複此步驟至pCurve終點。連結所有偏移點即得偏移曲線。
你可以用圓曲段去推敲上述流程,記得圓曲段方程式你要分成已知及未知各推敲一次,兩相比較後,如何對任意曲段(包含手繪線)求出其偏移曲線你就會有所體會。
或請參考:
『Offset Bézier Curves』及
『CGAL Manual, Section 24.3 "Offsetting a Polygon"』

(2)
從『LISP 求交點』裏的這個visualLISP
hhtsung 寫到:忘掉在那裡看到的一個函式,註解是試用改進後加上的
代碼:

;;Intersectwith是對VLAOBJ物件的方法,回覆交點串列
;; ee = acextendnone or 0 = 物件都不延伸
;;                      1 = 物件1延伸
;;                      2 = 物件2延伸
;;                      3 = 物件都延伸
(defun objinters (ent1 ent2 ee / IPTS PTS)
  (vl-load-com)
  (setq IPTS (vla-intersectwith
              (vlax-ename->vla-object ent1)
              (vlax-ename->vla-object ent2)
              ee
            )
        IPTS (vlax-variant-value IPTS)
  )
  (if (> (vlax-safearray-get-u-bound IPTS 1) 0)
    (progn
      (setq IPTS (vlax-safearray->list IPTS))
      (while (> (length IPTS) 0)
        (setq PTS (cons (list (car IPTS) (cadr IPTS) (caddr IPTS)) PTS)
              IPTS (cdddr IPTS)
        )
      )
    )
  )
  PTS
)
用法:
(setq en1 (cdr (assoc -1 (entget (car (entsel "\n選取物件一:"))))))
(setq en2 (cdr (assoc -1 (entget (car (entsel "\n選取物件二:"))))))
(objinters en1 en2 0)
你能看出它在AutoCAD內如何運作嗎?

函式的重點在 (setq IPTS (vla-intersectwith (vlax-ename->vla-object ent1) (vlax-ename->vla-object ent2) ee) 這句程式碼:
•ent1及ent2是藉由entsel得到的,它的型別是ads_name。
•再藉由vlax-ename->vla-object取得對應的objectId,它的型別是AcDbObjectId。而objectId就是ent的記憶體位址對應的識別碼(你可以想像成你家實際位置是一組經緯度(記憶體位址),但是我們都用門牌號碼(識別碼)來記位置)。
•vla-intersectwith函式會根據ent記憶體位址讀取ent的內容後再作幾何數學之求交點的運算。
註:其實vla-intersectwith這個函式是visualLISP透過ActiveX介面間接呼叫ObjectARX API。而這種間接的方法普遍存在於visualLISP、AutoCAD.NET(VB.NET、C#.NET),至於autoLISP就饒了它吧。

上述解釋應該不難理解,但是你是否能從這些解釋看到更深一層的AutoCAD?
•(objinters ent1 ent2 0)這句程式碼告訴我們LISP的先天缺陷:傳值不傳址。
•從ads_name轉換為objectId:這是程式執行效率降低的原因之一。
•根據objectId所開啟的ent屬於AcDb物件:這種物件包含很多求交點時用不到的性質,如顏色、線形、圖層…。還有更可怕的,前面說過AutoCAD是MFC開發出來的,當然它也是OOP,而AcDb物件之上還有好幾層的父類別(見『objectarx_2010_c++_classes.dwf』),每一層父類別都有一堆用不到的性質,這更是程式執行效率降低的主因。因此,ObjectARX提供一套對應AcDb物件之AcGe物件,它包含更廣泛的幾何數學運算,同時拿掉不必要的性質。

(3)
在『如何查出CAD圖形瑕疵』
和『如何刪除聚合線上多餘掣點』
及『刪除重覆物件』
談的內容都是繞著幾何數學打轉,並且都提及ExpressTools。但是如果你像我一樣從未使用過ExpressTools(不過為了知道它有那些檔案我倒是安裝過一次),那麼你要如何解決那三篇貼文所提到的問題?答案是使用AcGe物件的幾何數學運算功能你也可以自己寫類似ExpressTools的程式。以下是AcGe物件部份功能:
•isOn():檢查點是否在曲線上。
•overlap():檢查兩直線是否重疊。
•isClosed():檢查曲線是否閉合。
•isColinearTo():檢查兩直線是否共線。
•isParallelTo():檢查兩直線是否平行。
•isPerpendicularTo ():檢查兩直線是否垂直。
•intersectWith():求交點。

事實上,ExpressTools也是這樣作出來的,在ExpressTools安裝目錄內你可以看到很多arx檔,在這些arx檔裏就是使用了AcGe物件的各種幾何數學運算功能。

(4)
在『如何知道兩張圖是不是用copy的』及『如何使autocad無法複製別的圖檔進來』(兩主題合併到同一篇)談到圖檔拷貝的問題:
首先我們來談主題一,copy圖檔有兩種方法:
•以檔案總管直接拷貝圖檔。拷貝後,在AutoCAD內開啟兩張圖檔,對同一個圖元各LIST一次並記下Handle值,比較後你會發現兩個圖元的Handle值相同。各位,這種以AutoCAD資料結構的角度來判斷圖元關係才是正確的方法。這也是為什麼我在『參考文』多次提到掌握AutoCAD資料結構很重要的原因。一旦你了解它,那麼對於『請問是否能修改圖塊的HANDLE值』這個問題的答案,你就會很清楚不會再模糊不清。
•在AutoCAD內以copy/past的方法將某一個圖元拷貝至另一圖檔(拷貝後圖元的座標與來源圖元須一致),比較Handle後你會發現兩個圖元的Handle值不相同。為什麼會這樣?各位,AutoCAD認為copy是一種(合法的、聰明的)快速新建圖元的方法啊,它巴不得你多多使用copy來畫圖呢。
現在我們來談主題二:
經過上述分析後,你應該已了解AutoCAD未提供任何方法防止使用者使用copy指令,所以你必須自己開發這方面的程式:
•使用AcDbObjectReactor反應器(在『參考文』內有其他反應器的討論,其實反應器就是訊息處理函式)。這個反應器有個函式copied()可以使用,意思就是你把刪除圖元的程式碼寫好,只要有圖元被拷貝,反應器就會做刪除新建圖元的動作。不過你應看得出來效率不高。
•使用勾子(hook)程序。當使用者下達copy指令,正常情況下這個指令(其實對作業系統而言它就是個訊息)會傳給AutoCAD,使用勾子我們可以把copy指令攔截下來,這會使得AutoCAD根本不知道使用者有下達copy指令自然就不會有拷貝的動作。其實勾子的應用範圍很廣,例如使用勾子+計時器(Timer)我們可以在AutoCAD作出『滑鼠手勢』的功能。
•使用Overrule(規則重新定義)方式。這是AutoCAD2010以後版本才有的功能。它讓我們可以針對要拷貝的圖元重新定義copy指令的含意(當然就是不要拷貝)。一般而言,你在網上看到Overrule的應用主是在顯示方面,如『漫談AutoCAD特定領域版本之一二事』,若是你想了解如何畫出那些圖形,那麼在autodesk AutoCAD.NET專欄作家 Kean 的blog『Customizing the display of standard AutoCAD objects using .NET』你可以看到C#程式碼。要是你擔心看不懂C#,以下是”畫直線卻顯示圓管”一些簡略說明:

代碼:

public override bool WorldDraw (Drawable d, WorldDraw wd)
{
if (d is Line)
   {
   // Draw the line as is, with overruled attributes
   …
   // Draw a pipe around the line
      EntityColor c = wd.SubEntityTraits.TrueColor; 設定顯示參數
      wd.SubEntityTraits.TrueColor = new EntityColor(…);
      wd.SubEntityTraits.LineWeight = LineWeight.LineWeight000;

      Circle clr = new Circle(…);  設定圓管尺寸 
      ExtrudedSurface pipe = new ExtrudedSurface();
      pipe.CreateExtrudedSurface(clr,…);  擠出圓管 

      pipe.WorldDraw(wd);  繪製圓管
}

}
其實原理很簡單,你畫直線並藉由上述方式以圓管型式顯示,但你畫的圖元它的本質一直都是直線。在你對整個程式碼都了解後,類似於上述”設定顯示參數及繪製圓管”方式還可以應用在jig上,它讓你得以實現動態拖動(如copy、move時,被選中的物件會跟著游標到處跑)及動態繪製(如『請問點選圓心後顯示圓輪廓的lisp語法』:你將可以感受到jig與grread+grdraw二者在功能及效率上的明顯差異。或『從任意角度的線上指定任意點畫出垂線該如何鎖點』:這讓你在對多條不同角度的線畫出垂線時無需頻繁變更UCS,如同在處理水平和垂直的情況。)

•使用自定義物件(Custom Entity)。以上三種方法ObjectARX及AutoCAD.NET皆可實現,唯獨此法只有ObjectARX具有專用權,而且上述三法皆須圖檔開啟後再載入程式,但自定義物件是直接存在於圖檔中。以直線為例,AutoCAD的直線物件其名稱為LINE,假設你定義了你自已的直線物件其名稱為myLINE(其實它是一個類別,還記得一開始我就提過AutoCAD是以MFC、OOP開發出來的嗎?),你可以把myLINE的copy功能拿掉,當你同時選取LINE及myLINE要複製時,你會發現只有LINE跟著游標跑而myLINE則不動如山根本就不理你。再來你去看『圖紙被加密,連打印都實現不了,怎麼辦』現在你就知道原來要實現不能分解、不能編輯、不能捕捉…是從這裡下手。這時你繼續去看『圖檔鎖定問題』答案應該很清楚了。不過,它帶出這篇『保護智慧財產』時問題來了,那就是DWF。從官網『Autodesk DWF Toolkit 7.7』上你可以看到這句話”The newest version of the DWF Toolkit 7.7 provides APIs for reading and writing DWF/DWFx files.”:DWF工具包讓你可以讀/寫DWF檔,同時連其C++ source code也一併給你,這表示你可以在你所開發的arx檔裏直接整合讀/寫DWF的功能,並意謂著用DWF的方式無法有效保護圖檔(這與DWF是不是外參無關)。

Tiger&蘋果爸 寫到:答對了 恭喜您的回覆獲選為回帖精華文章! < 積分+1、威望+6 >

[公告]關於論壇的文章價值


Tiger&蘋果爸 在 2012-10-18, 16:49 作了第 1 次修改 (原因 : 【回帖精華】)
nobody
nobody
初級會員
初級會員

文章總數 : 32
年齡 : 48
來自 : 台北
職業 : 待業
愛好 : 電腦繪圖
個性 : 開朗
使用年資 : 新手初學
使用版本 : 新手初學
積分 : 3
經驗值 : 4936
威望值 : 116
回帖精華 : 1
注冊日期 : 2011-06-07
男 雙子座 兔

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 kevinjyh 2012-10-15, 17:02

哇!遇到高手了! 熱情
您的回復有很多內容且高深,一時消化不良 頭暈目眩 ,等我看懂後,再向您討教!

謝謝!
kevinjyh
kevinjyh
一般會員
一般會員

文章總數 : 22
年齡 : 54
來自 : 台東
職業 : 營建業
愛好 : 電腦
個性 : 好相處
使用年資 : 5年
使用版本 : 2008
經驗值 : 4623
威望值 : 18
注冊日期 : 2011-12-17
男 雙魚座 狗

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 nobody 2012-10-17, 20:28

《二、ObjectARX的擴充應用》
上一章談的都是AutoCAD本身的內容,這一章我們來談些AutoCAD沒有的內容,而且操作的環境還是在AutoCAD內。不囉唆,咱們開始吧:
註:我把本章所談到的內容做成演示片(avi檔)上傳到
http://www.crocko.com/397BF4E6E40345DC8827A0EC8F5A0B43/ObjectARX的擴充應用演示.rar

ObjectARX的擴充應用演示備用載點: http://db.tt/6aJbHt9W

建議觀看畫面放大到最大,而演示片所使用到的程式,我不方便上傳,這點請見諒。

(1)
從『開啟圖檔』你能看到什麼現象?沒錯,以最後的結果而言就是開啟圖檔,但難道真的就如回覆者gtjove所說的”只是2者的動作步驟交換而已”這樣嗎?
各位回想一下,開啟圖檔時你最常遇到什麼情形?惱人的替換字型視窗總是會出現。即使你找過很多文章如『DWG圖檔找不到大字體(SHX檔)之「替代大字體」解決方案』、『快速選取常用字型』…看到各式各樣的解決方法,但總是會遇到例外情形因而無法一次到位(見『關於開啟圖面時 CHINA.SHX 字型找不到,而要手動指定成 chineset.shx 字型檔問題的回覆』由ykva8983回覆:”除了將每一種找不到的字型都逐一在對應檔中設定過的方式之外,有沒有其他方式能讓找不到字型"自動選擇"成chineset呢?”。及『請問如何讓AUTOCAD開檔的速度加快及字型可以自動化! 』由smallworm16回覆:”不過這樣就變成遇到沒有的字體時就要自己在字體對映檔裡面輸入,想請問還有更便捷的方法嗎?”)。我在『參考文』曾提過要解決這個問題你須先學會如何使用反應器來觀察autocad開啟圖檔的過程,看到了嗎?答案揭曉了,而且一旦你實際觀察過你就會了解兩種開檔方式有何差異。
在下載的演示片中你會看到Font1.avi及Font2.avi:
•Font1.avi:第一次開啟AutoCAD後馬上開啟圖檔,替換字型視窗會出現。第二次開啟AutoCAD後先載入Font.arx檔再開啟圖檔,替換字型視窗不會出現。如果你把AutoCAD設定成開啟時自動載入Font.arx檔,那麼所有在AutoCAD開啟後才開啟的圖檔皆不會出現替換字型視窗。
•Font2.avi:第一次直接開啟圖檔(註),當然替換字型視窗會出現。第二次直接開啟前先執行Font.exe再開啟圖檔,替換字型視窗不會出現。因為兩種開檔方式造成不同的開檔過程,這導致上述設定AutoCAD開啟時自動載入Font.arx檔在本情形無效。至於執行Font.exe時產生的那個醜醜的對話框,那是為了本演示臨時改的。其中第三個按鈕(Minimize)可以在你執行Font.exe後將對話框縮小到螢幕下方最右邊的托盤(tray)內,這樣就不會杵在那兒礙眼,或者你也可以設定成電腦一開機就自動執行Font.exe。不管如何,重點在執行了Font1及Font2的方式,從此你不會再有替換字型視窗的困擾。
註:所謂直接開啟圖檔其方式很多種:在資料夾中的圖檔連點左鍵兩下、將資料夾中的圖檔托進AutoCAD、在命令提示字元視窗(DOS視窗)輸入開啟圖檔的命令…,這些各式各樣的情形都得考慮,這樣的程式才是完整的。

(2)
AutoCAD的主要功能是繪圖,但是在職場上常常需要與別種工具互相搭配才能完成一件工作,而不同軟體之間的搭配有時反而讓問題更複雜。如果有人問你”可不可能讓AutoCAD也能具有繪圖以外的功能?”,我想你的答案應該會是”可以寫外掛程式來補其不足,不過那主要還是針對繪圖方面阿啊!”現在請看以下這張圖:
【回帖精華】Offset指令的演算法源碼 Notepadh
在下載的演示片notepad.avi中你會看到:那個以ObjectARX開發的(其實是直接套用MFC的類別)名稱為未命名的視窗已經完全被整合進AutoCAD內,這樣的整合使得AutoCAD同時具備notepad的功能。
註:如果你夠細心就會發現當焦點在未命名視窗時,AutoCAD主視窗上的文件名還是Drawing1.dwg,這是因為程式是為了演示臨時做的,考慮不會很周詳,重點是在它與AutoCAD的整合,後續的演示也都有此情形我就不再提起。

各位,我們不可能有AutoCAD的source code,那麼上述的整合是如何做到的?我在第一章說過AutoCAD是MFC開發出來的,而notepad的部份是我們自己透過ObjectARX以MFC開發的,二者都與MFC相關那就搭上邊了。另外,我在『參考文』曾提過ObjectARX能與AutoCAD執行時所使用之記憶體直接溝通,這更表示ObjectARX與AutoCAD之間是互通的。事實上,細節就隱藏在我一開始就提出的那五項裏(你可不要以為第四項說的是OpenGL,所以和AutoCAD無關,這點我會在後面証明給你看)。

(3)
請看以下這張圖:
【回帖精華】Offset指令的演算法源碼 Tabview
而在演示片TabView.avi中你也會看到:以ObjectARX所開發的(也是直接套用MFC的類別)名稱為未命名的多標籤視窗已經完全被整合進AutoCAD內,而三個標籤(當然,個數可以增減)頁面所具備的功能就看你如何開發。如:
•View1為視頻播放器(讓你用AutoCAD看電影)。
•View2為數值分析運算介面(使用ObjectARX就是使用MFC當然就是使用C++,而用C++作數值分析則是很平常的應用)。
•View3為遊戲機(網上看過有人以AutoCAD.NET寫一些在AutoCAD內玩的game,不過其執行效率實在是…,但用這種整合方式開發的game其效率就如同你在玩獨立的game,這是因為那個未命名視窗並未使用AutoCAD的圖形系統(Graphics System)) 。

至於其他的應用有一句話可以形容:只有想不到的,沒有做不到的。

上面三個View各自有自己的數據資料,另外則會有一個總資料庫來管理三個View的數據資料。你把這句話對應到圖片右方的Drawing1.dwg:三個View的數據資料對應modal space 及paper space,這些space的圖元資料全部存在Drawing1.dwg的資料庫裏。而當你把modal space的圖元加到(或說映射)paper space,存檔後圖檔會增大,這時你看這篇『關於製圖習慣所遇到的困惱』,其中pizg這句話“圖紙空間並非是用來讓3D作業方便的,它主要用來配置圖面與出圖.”說的真好,尤其是前半句(不過礙於篇幅就不談了),然後你再看原發問者joanne0415所問的內容,只要她的圖紙空間內容越多就表示圖元(AcDb物件)越多,而我在第《一.2》節說過AcDb物件之上還有好幾層的父類別,這表示每個AcDb物件所需的記憶體量比你表面上看到的還多。如果她的硬體資源不多,扣除系統要用的資源後,AutoCAD操作圖檔時能用的資源更少,這就是為什麼她的圖檔只有5M卻會使AutoCAD嚴重lag的原因之一。

(4)
『將CAD中用線畫成的表格及內部文字匯出到WORD檔』、『請教Excel建立資料,AutoCAD執行繪製? 』、『如何將Excel或文字檔展點在AutoCAD上』這三篇是關於AutoCAD與Excel之間如何溝通,現在請看以下這張圖:
【回帖精華】Offset指令的演算法源碼 Spreadsheet1
而在演示片SpreadSheet1.avi中你也會看到:以ObjectARX所開發的(參考了Programming Windows with MFC 2ed. Jeff Prosise,及網上很多的討論,包括兩岸及國外)名稱為未命名的試算表已經完全被整合進AutoCAD內。
AutoCAD與Excel是各自獨立的軟體,因此要在二者之間傳遞資料並不是那麼容易,所以乾脆就做個試算表能夠在AutoCAD內做些簡單的運算。如果你把這個試算表套在上一節那個多標籤視窗,乍看之下還和Excel有些相似。另外,為了在沒有AutoCAD的電腦上作業,還需一個獨立的試算表,請看以下這張圖:
【回帖精華】Offset指令的演算法源碼 Spreadsheet2
相關演示請看SpreadSheet2.avi。
這兩個試算表共用相同的檔案格式,所以在SpreadSheet1開啟SpreadSheet2做好的檔案,其內容就可以直接在AutoCAD顯示,當然反之亦然,也就是AutoCAD內圖元有所修改則SpreadSheet1亦同步更新。不過,SpreadSheet1與 AutoCAD相關連的這部份程式碼我來不及放進製作演示片的程式中,請見諒。

(5)
看到這裡你或許會問:有沒有可能在我們自己的視窗中顯示AutoCAD圖形?答案是:有,就在ObjectARX SDK的例子(BlockView)裡。不過,因為是ObjectARX SDK的例子,所以我未準備任何資料,但是你可以在autodesk AutoCAD.NET專欄作家 Kean 的blog『 AutoCAD .NET version of the ObjectARX BlockView sample 』看到相關C#程式碼。以下這張圖摘自Kean 的blog:
【回帖精華】Offset指令的演算法源碼 Blockview

(6)
OpenGL很強大,你的確可以用它來開發一套CAD系統,那麼它與AutoCAD之間的關係呢?你看以下這張圖:
【回帖精華】Offset指令的演算法源碼 Opengl1
在下載的演示片OpenGL1.avi中你會看到:兩個以ObjectARX開發的OpenGL程式已經完全被整合進AutoCAD內。第一個是以前在網上找到的(已忘記在那找到的),我做了一些修改,主要是原始版本的座標軸在球體中央且樣式較簡單,我把它改為在左下角及不同樣式,不過,好像小了一些。第二個是取自Visual Studio 2010裏一個例子(Cube),你也可以自MSDN下載到此例。原始版本為SDI(單文檔)及以按鈕控制彩色立方體的開始/停止旋轉,我把它改為MDI(多文檔)及以滑鼠左鍵控制彩色立方體的開始/停止旋轉,不過,不曉得是不是因為我用的免費螢幕錄影程式”Freez Screen Video Capture”的關係,彩色立方體旋轉時會頓頓的,實際上在我這台快五年的老機器運轉它可很順暢。
上面是OpenGL程式已整合進AutoCAD內的演示,不過,你說的是以OpenGL開發一套CAD系統,你再看以下這張圖:
【回帖精華】Offset指令的演算法源碼 Opengl2
在演示片OpenGL2.avi中你會看到:這個以MFC開發的OpenGL程式(也是以前在網上找到的,太久了,已忘記在那找到的),主要是按下滑鼠左鍵產生水波紋,我只把它改為MDI(多文檔),並且刻意不整合進AutoCAD。
nobody
nobody
初級會員
初級會員

文章總數 : 32
年齡 : 48
來自 : 台北
職業 : 待業
愛好 : 電腦繪圖
個性 : 開朗
使用年資 : 新手初學
使用版本 : 新手初學
積分 : 3
經驗值 : 4936
威望值 : 116
回帖精華 : 1
注冊日期 : 2011-06-07
男 雙子座 兔

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 kevinjyh 2012-10-18, 09:54

暈倒 看完NOBODY的回文後,
我感覺我就像一個小孩子,以為只是在玩沖天炮,結果原來我點燃的竟是
NASA火星任務的火箭~~~~ 三條線

真的遇到高手了!
我對這領域,一直是有心,但專業不足,看來以後要多多向NOBODY兄
討教了!
在此先謝了!請容我慢慢吸收及消化。


kevinjyh 在 2012-10-18, 18:41 作了第 1 次修改
kevinjyh
kevinjyh
一般會員
一般會員

文章總數 : 22
年齡 : 54
來自 : 台東
職業 : 營建業
愛好 : 電腦
個性 : 好相處
使用年資 : 5年
使用版本 : 2008
經驗值 : 4623
威望值 : 18
注冊日期 : 2011-12-17
男 雙魚座 狗

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 Tiger&蘋果爸 2012-10-18, 16:56

nobody大大您的文章真的很精采,我也要找時間消化!
感恩您的分享!
害羞

____________________________________________________________________________________
👉[好康]🎁加入專屬B取得大補帖及看2D+3D影片(點我)👈
【回帖精華】Offset指令的演算法源碼 Sesa2011 【回帖精華】Offset指令的演算法源碼 Youtub11 【回帖精華】Offset指令的演算法源碼 Oiea2011 【回帖精華】Offset指令的演算法源碼 Oe20011 【回帖精華】Offset指令的演算法源碼 Fbi20011 【回帖精華】Offset指令的演算法源碼 Line2011
Tiger&蘋果爸
Tiger&蘋果爸
系統管理員
系統管理員

文章總數 : 21077
年齡 : 48
來自 : 台北市文山區
職業 : AutoCAD顧問
愛好 : 蹓狗/戶外活動/拍照/吸貓
個性 : 幽默/樂觀/善良
使用年資 : 20↑
使用版本 : AutoCAD 2022
經驗值 : 88422
威望值 : 16930
注冊日期 : 2008-04-23
2D基礎函授 2D進階函授 3D基礎函授 https://i.servimg.com/u/f11/19/71/67/71/2d3d10.png2D+3D線上 顧問外掛程式 經典問與答讀者 藍鵲1號
2009聚會勳章 2010聚會勳章 2011聚會勳章 2012聚會勳章 2013勳章-2D基礎 2014聚會勳章 2015聚會勳章 2016聚會勳章 串連貼紙成功 男 水瓶座 兔

http://mypaper.pchome.com.tw/kv1012tiger

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 greetingsfromtw 2012-10-19, 11:11


這可不是普通人寫得出的,太猛了,真的是第一次感受到ObjectArx的威力,
以前從沒看過可以用這種方式去擴充CAD功能的,大開眼界,太威啦!

--
看了以後好想要厚臉皮地麻煩n大幫寫程式阿(小聲)....























____________________________________________________________________________________
【回帖精華】Offset指令的演算法源碼 Acad2010 【回帖精華】Offset指令的演算法源碼 Acad1810
【回帖精華】Offset指令的演算法源碼 Acad1211 【回帖精華】Offset指令的演算法源碼 Acad1311 【回帖精華】Offset指令的演算法源碼 Acad1511
greetingsfromtw
greetingsfromtw
初級會員
初級會員

文章總數 : 222
年齡 : 39
來自 : 高雄
職業 : CAD菜鳥繪圖員
愛好 : 吃好吃的東西
個性 : 文靜
使用年資 : 不到兩年
使用版本 : 公司為2008,家中為2011
積分 : 3
經驗值 : 5575
威望值 : 189
注冊日期 : 2012-05-02
經典問與答讀者 藍鵲441號
男 天蝎座 鼠

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 kevinjyh 2012-10-19, 11:51

目前我手上僅有「ObjectARX開發實例教程-張帆」屬最完整的ObjectARX教材,
想請問nobody大大,還有其它的嗎?
英文版的亦無妨(從第一封PO文至今,我的英文程度算是突破了許多 偷笑)。

其實三、四年前曾用過ObjectARX+AutoCAD 2002寫過讀取並繪製測量點的小程式,
後來看到別人寫的更完整,我就放棄了。
這個月,因為朋友有需要,他希望能直接讀取MS Project的資料(是一種專案管理的軟體),
轉換為我們工程專用的節點式網狀圖(用CAD畫的較方便出圖及審閱),所以我又開始想重操
舊業,但這幾天搜尋的結果,Autodesk好像把二次開發的工具,從ObjectARX,
漸漸轉到.Net了,不知我是否有理解錯誤?

這是Autodesk教導使用.Net寫一個Plug-in的連結

另外附件是國外一個教學影片上截取下來的對照表圖檔,請參考。

不管用那個工具,能寫得出來最重要,所以………(更小聲地說)屆時會有很多問題向nobody兄請教 傻笑
【回帖精華】Offset指令的演算法源碼 Cadaoa10
kevinjyh
kevinjyh
一般會員
一般會員

文章總數 : 22
年齡 : 54
來自 : 台東
職業 : 營建業
愛好 : 電腦
個性 : 好相處
使用年資 : 5年
使用版本 : 2008
經驗值 : 4623
威望值 : 18
注冊日期 : 2011-12-17
男 雙魚座 狗

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 nobody 2012-10-20, 16:34

Tiger&蘋果爸 寫到:nobody大大您的文章真的很精采,我也要找時間消化!
感恩您的分享!
害羞
蘋果爸,您客氣了。其實也要謝謝蘋果爸提供這個平台讓大家有一個討論的空間。感恩再感恩!


kevinjyh 寫到:目前我手上僅有「ObjectARX開發實例教程-張帆」屬最完整的ObjectARX教材,
想請問nobody大大,還有其它的嗎?
英文版的亦無妨(從第一封PO文至今,我的英文程度算是突破了許多 偷笑 )。

其實三、四年前曾用過ObjectARX+AutoCAD 2002寫過讀取並繪製測量點的小程式,
後來看到別人寫的更完整,我就放棄了。
這個月,因為朋友有需要,他希望能直接讀取MS Project的資料(是一種專案管理的軟體),
轉換為我們工程專用的節點式網狀圖(用CAD畫的較方便出圖及審閱),所以我又開始想重操
舊業,但這幾天搜尋的結果,Autodesk好像把二次開發的工具,從ObjectARX,
漸漸轉到.Net了,不知我是否有理解錯誤?

自從微軟發表.NET平台後可以說是傾全力在推廣它,你從網上隨便一搜就可找到為數眾多的有關MFC與.NET比較的文章。看過那些文章以後,你會覺得雙方都說的有道理,但也都不能說服對方。不過,大致上你可以歸納出一個初步的結論:
•如果你了解MFC的原理,那麼你就會清楚Windows程式的底層操作且有關程式執行效率這方面你有相當程度的自主權,至於是否能快速開發出Windows程式那就各憑本事了。(上一章那些未命名視窗就是直接呼叫底層API而開啟的,這樣就避免了煩人的開檔對話框)
•如果你熟悉.NET的運用,那麼你可以容易地快速開發出Windows程式(因為底層機制被包裝起來,你只需知道怎麼使用.NET的工具,而不用去管這些工具如何操作底層機制)。至於程式執行效率這方面,嗯,俗話說得好”凡事有一好沒二好”。

回到AutoCAD,不過在開始之前我想先大概地說明AutoCAD的變革:
當初autodesk要推出AutoCAD r13時將整個程式碼以C++重新改寫,這個動作是AutoCAD成為物件導向之視窗程式的主因。而推出AutoCAD 2000時則是將整個程式碼改為多文檔介面(MDI)。至於AutoCAD後續版本(2000i~2013)的發展主要是在基於前述兩個重要變革所完成的架構下進行一些bug的修復及增添其他新的功能,如3D繪圖功能的加強、Unicode標準的使用、二次開發時可以使用AutoCAD.NET、...。
知道了AutoCAD大概的變革,請看以下這張圖(摘自『 ObjectARX 2010 官方培训教程』):
【回帖精華】Offset指令的演算法源碼 Apip
我在第《一.2》節說過:visualLISP、AutoCAD.NET(VB.NET、C#.NET)是透過ActiveX介面間接呼叫ObjectARX API。
我在第《二.2》節說過:ObjectARX能與AutoCAD執行時所使用之記憶體直接溝通,這表示ObjectARX與AutoCAD之間是互通的。
現在你再看一次上面那張圖,如果AutoCAD的核心不變,你認為以AutoCAD.NET進行二次開發時不用透過ObjectARX API嗎?其實autodesk現在的大策略就是跟著微軟走,而微軟強推.NET自然autodesk也是如此。不過,有個現象很怪,我在第《二.4》節提過Custom Entity(自定義物件),這是AutoCAD二次開發的一把大刀,而Overrule(規則重新定義)在Custom Entity面前就像一支小刀。AutoCAD自2005版開始可以使用AutoCAD.NET來開發外掛程式,而隨著AutoCAD一年發表一個版本,以AutoCAD.NET作為開發工具的人也越來越多,但AutoCAD.NET始終無法作出自定義物件的這個情形也是讓那些AutoCAD.NET開發者在AutoCAD每年發表新版本時跟著懊惱一次。

另外,在『ObjectARX & Dummies』你可以去看看。


《三、ObjectARX的擴充應用行業篇》
這一章來談些如何把ObjectARX應用在行業上,當然,你也可以思考如果讓你用其他的程式語言你會怎麼做。不過,不談”人”的問題,因為答案是無解:無限多組解。

(1)
在『公司與公司之間-對繪圖員的隔空交火』說到:每一次的內容多半是"把圖面上的編號拿掉"、"上面的這個標題移動下面"、"這不是只要放大縮小就可以了嗎?",但是修改圖塊檔的關係,整張畫面及所以圖案的版面要全部整理過。
及『這樣子的公司適合繼續待嗎?』說到:圖面管理部份,真的很亂的可以,但在這個時後,公司卻開始想要用系統的方式來管理圖面,這固然是好,但是...20多年的圖面的,我該怎麼做?
上述這些問題若由你來解決,你會如何做?假設你畫的物品含1個接頭及2組螺栓、螺母,而在AutoCAD內接頭以兩同心圓表示(兩圓間距離表厚度),至於螺栓、螺母則以某些線條表示。我會把兩同心圓定義成”一個”物件其名稱為接頭,並把那些線條定義成另”一個”物件其名稱為螺栓或螺母,最後再定義”物品”這個物件是由”接頭”與”螺栓、螺母”所組成。另外我也會定義好接頭與螺栓、螺母間的關聯行為,如接頭尺寸改變則兩同心圓須自動同步更新其半徑或螺栓、螺母依事先定義好的規則來增減組數。再者若公司夠用心的話,可以把這物品的責任範圍畫分清楚,如若因更改接頭尺寸致螺栓、螺母組數改變其責任由誰來負責。各位,這就是Custom Entity(自定義物件):AutoCAD二次開發的一把大刀,這是你用傳統的AutoCAD畫圖方式完全做不到的,且把為什麼我要一開始就提出的那五項裏的第三項(要談OOP就應該包含類別、封裝、繼承•••)給揭露出來。

(2)
在『請問某特定業(內詳)有人利用AUTOCAD建置3D模型及計算材料用量?』、『請教CAD與Revit的不同』及本篇中由gtjove所分享『關於Revit的問題』:談的是Revit系列軟體的討論。
如果你仔細看完,綜合大家討論的意見,你得到的結論會是:Revit以元件為單位整合所有參與同一專案的廠商圖面。這樣的結論應該還是很多人看不懂,我以上一節那顆小螺栓為例,如接頭尺寸改變致螺栓直徑須加大,若是螺母直徑不變,那麼圖面衝突就產生了,而類似這樣檢視衝突的功能對自定義物件而言是很容易實現的。不過對於像Revit這麼大的軟體以一顆小螺栓來解釋它實在是太不敬,而且其功能遠過於此。現在以建築物為例:一棟建築物裏,每隻柱、每隻樑、每塊版、每道牆各自代表一個元件(自定義物件),若是圖面上某隻柱的位置有所移動,那麼連結到該柱的樑、版、牆也會有影響,這時程式就須提醒程式操作者將此情況反應給結構設計單位(Revit本身無結構分析之功能)並請其確認相關結構安全的問題。各位,既然這些ObjectARX都做得到,那為何autodesk不將這功能納入AutoCAD裏?自從autodesk買下Revit後,也投入不少資源在後續的研發上,這也使Revit的功能越強,此時若考慮市場、行銷等因素,那麼答案你應該就想得到。

(3)
以下三篇『請問圖塊裡兩個增強屬性的值如何同步』、『關於圖框圖塊的小問題』、『如何能把object 和文字連繫在一起』談的是不同圖元間的同步處理(不管你用什麼方式解決)。現在你看這兩篇『請問cad有辦法做區域辨識或者一些連結的動作嗎』、『autocad 有無什麼功能可以達到交互參考的作用』這揭露lisp處理跨圖檔這類問題時的窘境,尤其是最後那篇litung點出不管是外部參考或圖塊皆無法解決問題,好,你再去看『外部參考優點』、『外部參考路徑的改變』、『外部參考途徑問題』,的確,外參這方式無效,怎麼辦?

我在『參考文之回文』曾提過以前寫過一程式(主要是用於建築結構方面),那支程式除了要解決類似上述的問題外還希望在切換圖檔時能夠更有效率,而切換圖檔以多標籤的型式來處理是最直接有效的方式,這也是為什麼當初在『讓CAD也有分頁功能』貼出iDwgTab這支程式時我會說沒有在使用該程式的原因。

請看以下這張圖:
【回帖精華】Offset指令的演算法源碼 Dwgtab1
其中1.jpg是獨立的一張圖檔。專案A表示一套結構圖,它含有A.prj、A1.dwg~A5.dwg。
假設你在AutoCAD內已開啟1.jpg、A.prj、A1.dwg三個檔案,當你切換至1.jpg時,因為它與專案A無關,所以A.prj、A1.dwg被隱藏了。

而以下這張圖:
【回帖精華】Offset指令的演算法源碼 Dwgtab2
當你切換至專案A時,1.dwg被隱藏,同時A.prj、A1.dwg出現在第二組多標籤,這組多標籤你可以動態的選擇要置於主視窗的上方、下方、左方、右方,另外主視窗背景也表示目前是切換至專案A。

而主視窗背景若只以文字顯示實在是很單調,改成圖片來看看(當然你也可以換成你的全家福照片):
【回帖精華】Offset指令的演算法源碼 Dwgtab3
註1:畫面中之圖片是以google在網路上搜尋atoll的結果,如有侵權請留言告知,收到後立即刪除,謝謝!
註2:我把這支多標籤程式的內容做成演示片(avi檔)上傳到『DwgTab.rar』,在演示片裏你可以看到多標籤動態切換的過程。

上述A.prj是一張總圖(可以是結構平面圖、結構物的3D構架圖),如果我們在總圖改了某隻柱(比如單側加長1m),這表示該柱之配筋圖(畫在A1.dwg裏)及相關聯某隻樑之配筋圖(畫在A2.dwg裏)都需修改,而且請注意A2.dwg並未開啟。只要結構物的元件(柱、樑、版、牆:自定義物件)都設定好,那麼A1.dwg(已開啟)裏的柱配筋圖經由反應器同步修改,而A2.dwg(未開啟)裏的樑配筋圖修改過程如下:
•以ObjectDBX(註3)在不開啟A2.dwg的情形下讀取其資料庫。
•藉由已定義好的自定義物件規則(註4)修改樑配筋圖。
•將修改過的資料庫寫回A2.dwg。
整個過程你在螢幕上看不到A2.dwg被開啟,繪圖者只需下指令給AutoCAD,剩下的就讓AutoCAD去忙吧。這樣一個大量自動化流程除了解決本節一開始談到的問題,更重要的是它對繪圖效率帶來了明顯的提升
註3:ObjectDBX是ObjectARX SDK中的一個子集合。而AutoCAD的外部參考就是這麼做出來的,你還可以由註4去推敲外部參考的相對路徑、完整路徑,這樣你的體會會更深。另外,現在看『如何在開啟圖檔時不讀取外部參考?』這篇,心裡應該有答案了。
註4:例如該柱關聯到那些樑、這些樑存在那張圖及樑的ID,這些動作並不需繪圖者來設定,而是由ObjectARX程式開發者來完成。

最後還有一點,上一節曾提過Revit本身無結構分析之功能,而我在第《二.3》節說過使用ObjectARX可以進行數值分析運算,如果你把有限元素法(註5)應用在這裡,那麼你也可以在AutoCAD裡進行結構分析。
註5:目前常見的結構軟體,如CSI-ETABS、MIDAS-GEN…,其使用的有限元素法理論都曾在國外相關的結構力學期刊發表過。
nobody
nobody
初級會員
初級會員

文章總數 : 32
年齡 : 48
來自 : 台北
職業 : 待業
愛好 : 電腦繪圖
個性 : 開朗
使用年資 : 新手初學
使用版本 : 新手初學
積分 : 3
經驗值 : 4936
威望值 : 116
回帖精華 : 1
注冊日期 : 2011-06-07
男 雙子座 兔

回頂端 向下

【回帖精華】Offset指令的演算法源碼 Empty 回復: 【回帖精華】Offset指令的演算法源碼

發表 由 zondersam 2012-10-30, 12:37

高來高去..霧煞煞..真是高手過招..利害利害
zondersam
zondersam
中級會員
中級會員

文章總數 : 64
年齡 : 53
來自 : 台北
職業 : CNC
愛好 : 看球賽
個性 : GOOD
使用年資 : 20年
使用版本 : 2008
積分 : 7
經驗值 : 5636
威望值 : 16
注冊日期 : 2009-03-14
經典問與答讀者 藍鵲303號
2009聚會勳章 2010聚會勳章 男 摩羯座 狗

回頂端 向下

回頂端


 
這個論壇的權限:
無法 在這個版面回復文章
【回帖精華】Offset指令的演算法源碼 Ioaoe110【回帖精華】Offset指令的演算法源碼 2020-310【回帖精華】Offset指令的演算法源碼 Oiu15010【回帖精華】Offset指令的演算法源碼 2020-211【回帖精華】Offset指令的演算法源碼 Ia15010【回帖精華】Offset指令的演算法源碼 Aizyao10【回帖精華】Offset指令的演算法源碼 Uos15010【回帖精華】Offset指令的演算法源碼 BPl3tjj【回帖精華】Offset指令的演算法源碼 Ziao1510
【回帖精華】Offset指令的演算法源碼 Oo-2-110【回帖精華】Offset指令的演算法源碼 Zuoiy_10【回帖精華】Offset指令的演算法源碼 Aizyao11【回帖精華】Offset指令的演算法源碼 Iyb_1510【回帖精華】Offset指令的演算法源碼 Aoe1-111【回帖精華】Offset指令的演算法源碼 Uos15011【回帖精華】Offset指令的演算法源碼 Aoe2da10【回帖精華】Offset指令的演算法源碼 Aoe2da11【回帖精華】Offset指令的演算法源碼 Aoe10