[已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
+9
aaronchung.tw
tarpon
ginse0727
stone1224
小五
suny999
Tiger&蘋果爸
pizg
franwist
13 posters
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論 :: 已解決主題精華區
第1頁(共1頁)
[已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
最近接到一套圖被很多人修過又套來套去的
很多線段都畫歪,有許多0.0004、0.0001之類的小數點
經理每看到一次就唸一次
又不准我花時間去把圖重新放樣
請問lisp有辦法寫出讓小數點好幾位的線段端點,去抓最靠近的0.5格點嗎?
謝謝
很多線段都畫歪,有許多0.0004、0.0001之類的小數點
經理每看到一次就唸一次
又不准我花時間去把圖重新放樣
請問lisp有辦法寫出讓小數點好幾位的線段端點,去抓最靠近的0.5格點嗎?
謝謝
franwist 在 2010-10-17, 07:49 作了第 1 次修改
franwist- 初級會員
- 文章總數 : 59
年齡 : 39
來自 : 桃園市
職業 : 建築設計
愛好 : 建築
個性 : 平易近人
使用年資 : 7
使用版本 : 2018
積分 : 1
經驗值 : 5583
威望值 : 34
注冊日期 : 2010-04-26
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
;;2010-10-15 By PizG
(defun c:FixDwg(/ FixVal ssl i ent dxf p1 x1 y1 z1 p2 x2 y2 z2)
;;(FixVal (setq r 123.234)) RETURN 123.0
;;(FixVal (setq r 123.456)) RETURN 123.5
;;(FixVal (setq r 123.789)) RETURN 124.0
(defun FixVal(r / v)
(setq v (rem r 1))
(cond
((< v 0.25) (setq ret (- r v)))
((< v 0.75) (setq ret (+ (- r v) 0.5)))
(T (setq ret (+ (- r v) 1)))
)
)
;;
(if (setq ssl (ssget '((0 . "LINE"))))
(progn
(setq i 0)
(repeat (sslength ssl)
(setq ent (ssname ssl i))
(setq dxf (entget ent))
(setq p1 (cdr (assoc 10 dxf)))
(setq x1 (FixVal (nth 0 p1)))
(setq y1 (FixVal (nth 1 p1)))
(setq z1 (FixVal (nth 2 p1)))
(setq dxf (subst (cons 10 (list x1 y1 z1)) (assoc 10 dxf) dxf))
(setq p2 (cdr (assoc 11 dxf)))
(setq x2 (FixVal (nth 0 p2)))
(setq y2 (FixVal (nth 1 p2)))
(setq z2 (FixVal (nth 2 p2)))
(setq dxf (subst (cons 11 (list x2 y2 z2)) (assoc 11 dxf) dxf))
(entmod dxf)
(setq i (1+ i))
)
(alert "DONE!")
)
)
(princ)
)
(defun c:FixDwg(/ FixVal ssl i ent dxf p1 x1 y1 z1 p2 x2 y2 z2)
;;(FixVal (setq r 123.234)) RETURN 123.0
;;(FixVal (setq r 123.456)) RETURN 123.5
;;(FixVal (setq r 123.789)) RETURN 124.0
(defun FixVal(r / v)
(setq v (rem r 1))
(cond
((< v 0.25) (setq ret (- r v)))
((< v 0.75) (setq ret (+ (- r v) 0.5)))
(T (setq ret (+ (- r v) 1)))
)
)
;;
(if (setq ssl (ssget '((0 . "LINE"))))
(progn
(setq i 0)
(repeat (sslength ssl)
(setq ent (ssname ssl i))
(setq dxf (entget ent))
(setq p1 (cdr (assoc 10 dxf)))
(setq x1 (FixVal (nth 0 p1)))
(setq y1 (FixVal (nth 1 p1)))
(setq z1 (FixVal (nth 2 p1)))
(setq dxf (subst (cons 10 (list x1 y1 z1)) (assoc 10 dxf) dxf))
(setq p2 (cdr (assoc 11 dxf)))
(setq x2 (FixVal (nth 0 p2)))
(setq y2 (FixVal (nth 1 p2)))
(setq z2 (FixVal (nth 2 p2)))
(setq dxf (subst (cons 11 (list x2 y2 z2)) (assoc 11 dxf) dxf))
(entmod dxf)
(setq i (1+ i))
)
(alert "DONE!")
)
)
(princ)
)
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
天阿 真是太神奇了
真的很大的幫助,萬分感謝~~~~
但PLINE是不是無法選取到? 剛剛試了幾次都一樣QQ
真的很大的幫助,萬分感謝~~~~
但PLINE是不是無法選取到? 剛剛試了幾次都一樣QQ
franwist- 初級會員
- 文章總數 : 59
年齡 : 39
來自 : 桃園市
職業 : 建築設計
愛好 : 建築
個性 : 平易近人
使用年資 : 7
使用版本 : 2018
積分 : 1
經驗值 : 5583
威望值 : 34
注冊日期 : 2010-04-26
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
franwist 寫到: 天阿 真是太神奇了
真的很大的幫助,萬分感謝~~~~
但PLINE是不是無法選取到? 剛剛試了幾次都一樣QQ
依照你的要求, 增加處理PLINE的功能, 程式碼如下所示,
若還有其它問題, 可以在此留言, 或發送短信給我.
;;By PizG
;;2010-10-16 增加處理PLINE
;;2010-10-15 處理LINE
(defun c:FixDwg (/ FixVal ssl i ent dxf typ p1 x1 y1 z1 p2 x2 y2 z2 lst j code)
;;(FixVal (setq r 123.234)) RETURN 123.0
;;(FixVal (setq r 123.456)) RETURN 123.5
;;(FixVal (setq r 123.789)) RETURN 124.0
(defun FixVal (r / v)
(setq v (rem r 1))
(cond
((< v 0.25) (setq ret (- r v)))
((< v 0.75) (setq ret (+ (- r v) 0.5)))
(T (setq ret (+ (- r v) 1)))
)
)
;;
(if (setq ssl (ssget '((0 . "LINE,LWPOLYLINE"))))
(progn
(setq i 0)
(repeat (sslength ssl)
(setq ent (ssname ssl i))
(setq dxf (entget ent))
(setq typ (cdr (assoc 0 dxf)))
(cond
((= typ "LINE")
(setq p1 (cdr (assoc 10 dxf)))
(setq x1 (FixVal (nth 0 p1)))
(setq y1 (FixVal (nth 1 p1)))
(setq z1 (FixVal (nth 2 p1)))
(setq dxf (subst (cons 10 (list x1 y1 z1)) (assoc 10 dxf) dxf))
(setq p2 (cdr (assoc 11 dxf)))
(setq x2 (FixVal (nth 0 p2)))
(setq y2 (FixVal (nth 1 p2)))
(setq z2 (FixVal (nth 2 p2)))
(setq dxf (subst (cons 11 (list x2 y2 z2)) (assoc 11 dxf) dxf))
)
((= typ "LWPOLYLINE")
(setq lst '() j 0)
(repeat (length dxf)
(setq code (nth j dxf))
(if (= (car code) 10)
(progn
(setq p1 (cdr code))
(setq x1 (FixVal (nth 0 p1)))
(setq y1 (FixVal (nth 1 p1)))
(setq code (list 10 x1 y1))
)
)
(setq lst (cons code lst))
(setq j (1+ j))
)
(setq dxf (reverse lst))
)
)
(entmod dxf)
(setq i (1+ i))
)
(alert "DONE!")
)
)
(princ)
)
Tiger&蘋果爸 寫到: 感恩您的無私分享<積分+1>
- 附件
Tiger&蘋果爸 在 2022-08-26, 11:05 作了第 2 次修改 (原因 : 讚一個!! 補上傳程式)
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
pizg大大實在是太熱心了
我真的很感動~QQ
我真的很感動~QQ
franwist- 初級會員
- 文章總數 : 59
年齡 : 39
來自 : 桃園市
職業 : 建築設計
愛好 : 建築
個性 : 平易近人
使用年資 : 7
使用版本 : 2018
積分 : 1
經驗值 : 5583
威望值 : 34
注冊日期 : 2010-04-26
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
很高興你的問題已獲得幫助~franwist 寫到:pizg大大實在是太熱心了
我真的很感動~QQ
提醒你:
已解決主題顏色要改為[無]
____________________________________________________________________________________
👉快速比例設定與出圖技巧-線上課程(點我)👈
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
我去年剛上班也遇過這種問題,所以寫了這個程式,使用前請先設定格線X間距GridUnit:0.5,0.5(這程式X,Y都用第一個當間距值,
如果要改成X,Y不等間距值的話再提出來討論吧,對Line很簡單,對聚合線就稍微麻煩了)
當時剛學CAD,lisp不熟所以副程式用中文變數請勿見笑,能用就好
--------------------------------------------------------------
(defun c:Fix(/ tor xen i cs)
(defun RoundUp(值 距)
(setq 正負(minusp 值)
餘數(rem(abs 值)距)
商數(-(abs 值)餘數)
結果(+(if(<=(* 0.5 距)餘數)距 0)商數))
(if 正負(- 結果)結果))
(defun LV(l)(vlax-make-variant(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0(1-(length l))))l)))
(defun VL(v)(vlax-safearray->list(vlax-variant-value v)))
(defun fixPt(p f)(list(RoundUp(car p)f)(RoundUp(cadr p)f)(RoundUp(caddr p)f)))
(setq tor (car(getvar 'GridUnit))); 採用系統格點間距,可自行設定格點間距(需為1/x值),例如:0.1, 0.5, 0.25, 0.125
(prompt (strcat "\n將採用系統格點間距GridUnit:" (rtos tor 2 2) "來調整端點座標,請選線或聚合線:"))
(setq ss (ssget '((0 . "LINE,LWPOLYLINE"))) i -1)
(repeat (sslength ss)
(setq xen(vlax-ename->vla-object (ssname ss (setq i (1+ i))))cs nil)
(cond
((=(vla-Get-ObjectName xen)"AcDbPolyline")
(ForEach c(vl(vla-get-Coordinates xen))(setq cs(Append cs(List(RoundUp c tor)))))
(vla-put-coordinates xen (lv cs)))
((=(vla-Get-ObjectName xen)"AcDbLine")
(vla-put-StartPoint xen(lv(fixPt(vl(vla-get-startpoint xen))tor)))
(vla-put-EndPoint xen(lv(fixPt(vl(vla-get-endpoint xen))tor))))))
(princ))
如果要改成X,Y不等間距值的話再提出來討論吧,對Line很簡單,對聚合線就稍微麻煩了)
當時剛學CAD,lisp不熟所以副程式用中文變數請勿見笑,能用就好
--------------------------------------------------------------
(defun c:Fix(/ tor xen i cs)
(defun RoundUp(值 距)
(setq 正負(minusp 值)
餘數(rem(abs 值)距)
商數(-(abs 值)餘數)
結果(+(if(<=(* 0.5 距)餘數)距 0)商數))
(if 正負(- 結果)結果))
(defun LV(l)(vlax-make-variant(vlax-safearray-fill(vlax-make-safearray vlax-vbdouble(cons 0(1-(length l))))l)))
(defun VL(v)(vlax-safearray->list(vlax-variant-value v)))
(defun fixPt(p f)(list(RoundUp(car p)f)(RoundUp(cadr p)f)(RoundUp(caddr p)f)))
(setq tor (car(getvar 'GridUnit))); 採用系統格點間距,可自行設定格點間距(需為1/x值),例如:0.1, 0.5, 0.25, 0.125
(prompt (strcat "\n將採用系統格點間距GridUnit:" (rtos tor 2 2) "來調整端點座標,請選線或聚合線:"))
(setq ss (ssget '((0 . "LINE,LWPOLYLINE"))) i -1)
(repeat (sslength ss)
(setq xen(vlax-ename->vla-object (ssname ss (setq i (1+ i))))cs nil)
(cond
((=(vla-Get-ObjectName xen)"AcDbPolyline")
(ForEach c(vl(vla-get-Coordinates xen))(setq cs(Append cs(List(RoundUp c tor)))))
(vla-put-coordinates xen (lv cs)))
((=(vla-Get-ObjectName xen)"AcDbLine")
(vla-put-StartPoint xen(lv(fixPt(vl(vla-get-startpoint xen))tor)))
(vla-put-EndPoint xen(lv(fixPt(vl(vla-get-endpoint xen))tor))))))
(princ))
suny999- 一般會員
- 文章總數 : 13
年齡 : 43
來自 : 台北
職業 : 結構技師
愛好 : 寫程式
個性 : 善良
使用年資 : 2年
使用版本 : 2012
經驗值 : 5749
威望值 : 27
注冊日期 : 2009-05-13
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
請問此lisp載入後要如何使用
小五- 一般會員
- 文章總數 : 17
年齡 : 42
來自 : 桃園
職業 : 繪圖
愛好 : 繪圖
個性 : 活潑
使用年資 : 5
使用版本 : 2008
經驗值 : 5119
威望值 : 24
注冊日期 : 2011-01-27
suny999- 一般會員
- 文章總數 : 13
年齡 : 43
來自 : 台北
職業 : 結構技師
愛好 : 寫程式
個性 : 善良
使用年資 : 2年
使用版本 : 2012
經驗值 : 5749
威望值 : 27
注冊日期 : 2009-05-13
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
好像斜線弄不出來,而且請問是移動的那一條線,是先選擇到的還是后選擇到
stone1224- 一般會員
- 文章總數 : 23
年齡 : 42
來自 : 深圳
職業 : 景觀設計師
愛好 : 運動
個性 : 外向
使用年資 : 10
使用版本 : 2013
經驗值 : 5230
威望值 : 6
注冊日期 : 2010-11-02
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
感謝PIZG前輩的程式分享,我也下載來使用了,對於來圖中有帶很多小數的線段,透過這個程式的校正,真的大大節省了許多時間,真是太好用了!
感恩吶!
感恩吶!
ginse0727- 高級會員
- 文章總數 : 256
年齡 : 50
來自 : 台北巿
職業 : 帷幕牆
愛好 : 電玩,漫畫,網路小說
個性 : 宅男/正直/死腦筋
使用年資 : 退伍後工作迄今,10年以上
使用版本 : 2012
積分 : 14
經驗值 : 6831
威望值 : 500
發帖精華 : 1
注冊日期 : 2010-07-13
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
很實用的程式感謝PIZG的分享
tarpon- 中級會員
- 文章總數 : 209
年齡 : 34
來自 : 台北
職業 : 設計
愛好 : 打球
個性 : 溫和
使用年資 : 5年
使用版本 : 2006
積分 : 6
經驗值 : 6254
威望值 : 263
注冊日期 : 2010-07-01
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
這程式經過我的測試好像只能修正直線和聚合直線的接點處,請問有辦法再加進弧線嗎?
這樣這程式就非常棒了,功能盡善完美,要是還能再加雲行線,難度很高嗎?
謝謝!
這樣這程式就非常棒了,功能盡善完美,要是還能再加雲行線,難度很高嗎?
謝謝!
aaronchung.tw- 初級會員
- 文章總數 : 89
年齡 : 46
來自 : Taipei
職業 : 繪圖
愛好 : 電腦網路,閑逛
個性 : 隨和
使用年資 : 8年
使用版本 : 2008
積分 : 1
經驗值 : 5197
威望值 : 25
注冊日期 : 2011-12-03
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
太感謝PIZG的分享
能夠做到這樣的程度
真的是要深入才行
讚+1
能夠做到這樣的程度
真的是要深入才行
讚+1
Jakie- 初級會員
- 文章總數 : 80
年齡 : 47
來自 : Tainan Baiho
職業 : 土木
愛好 : 自然藝術
個性 : 有點品味,有點走味~^.^
使用年資 : 8年
使用版本 : 2018
積分 : 1
經驗值 : 5515
威望值 : 87
注冊日期 : 2010-10-28
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
PIZG大大有辦法增加弧線的功能嗎?感謝你提供這個好程式。
aaronchung.tw- 初級會員
- 文章總數 : 89
年齡 : 46
來自 : Taipei
職業 : 繪圖
愛好 : 電腦網路,閑逛
個性 : 隨和
使用年資 : 8年
使用版本 : 2008
積分 : 1
經驗值 : 5197
威望值 : 25
注冊日期 : 2011-12-03
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
這程式太好用了,容我收藏,感謝PIZG大。
awi- 一般會員
- 文章總數 : 74
年齡 : 41
來自 : 新北市
職業 : 電機技師事務所
愛好 : 新奇有趣的事物
個性 : 固執
使用年資 : 6
使用版本 : 2012
經驗值 : 4647
威望值 : 42
注冊日期 : 2013-05-03
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
非常謝謝,這個超好用的,
事務所常被這樣的問題困惱,
光人工調整小數點就非常耗時,
因為這個的方便讓我想加入贊助會員,
事務所常被這樣的問題困惱,
光人工調整小數點就非常耗時,
因為這個的方便讓我想加入贊助會員,
liunvc- 一般會員
- 文章總數 : 15
年齡 : 35
來自 : 台北
職業 : 建築設計
愛好 : 運動
個性 : 樂觀
使用年資 : 3年
使用版本 : 2010
經驗值 : 5470
威望值 : 15
注冊日期 : 2010-02-18
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
請問PIZG大大,
FIXDWG您提供的小數點整數功能非常強大,很好用!!
只是有一個小問題不知道您有沒有方法可以解決,
當輸入FIXDWG後,線段會自動移位,例如原本線條在(0,0)會自動微調位置至(0.9,1.3),
即使線段無小數點,同樣也會跳位,
以致有時線段之間會產生0.5與1cm的空隙,無連結再一起,
還請您多幫忙,謝謝您,
FIXDWG您提供的小數點整數功能非常強大,很好用!!
只是有一個小問題不知道您有沒有方法可以解決,
當輸入FIXDWG後,線段會自動移位,例如原本線條在(0,0)會自動微調位置至(0.9,1.3),
即使線段無小數點,同樣也會跳位,
以致有時線段之間會產生0.5與1cm的空隙,無連結再一起,
還請您多幫忙,謝謝您,
liunvc- 一般會員
- 文章總數 : 15
年齡 : 35
來自 : 台北
職業 : 建築設計
愛好 : 運動
個性 : 樂觀
使用年資 : 3年
使用版本 : 2010
經驗值 : 5470
威望值 : 15
注冊日期 : 2010-02-18
bsl- 一般會員
- 文章總數 : 20
年齡 : 41
來自 : 苗栗
職業 : 製程工程師
愛好 : 看電影、玩遊戲
個性 : 很好相處
使用年資 : 新手初學
使用版本 : draftSight
經驗值 : 4273
威望值 : 12
注冊日期 : 2013-06-17
franwist- 初級會員
- 文章總數 : 59
年齡 : 39
來自 : 桃園市
職業 : 建築設計
愛好 : 建築
個性 : 平易近人
使用年資 : 7
使用版本 : 2018
積分 : 1
經驗值 : 5583
威望值 : 34
注冊日期 : 2010-04-26
Tiger&蘋果爸 likes this post
回復: [已解決]請問LISP有辦法做到把圖面上畫歪的小數點線段修成整數嗎?
謝謝回報,我也補上傳程式囉franwist 寫到:我試了一下,用visual lisp編輯器打開把每行開頭?的地方刪掉就可以正常運作了
____________________________________________________________________________________
👉快速比例設定與出圖技巧-線上課程(點我)👈
franwist likes this post
AutoCAD顧問 :: 技術(發言等級:一般會員) :: :: 進階討論 :: 已解決主題精華區
第1頁(共1頁)
這個論壇的權限:
您 無法 在這個版面回復文章