Các bác ơi làm cách nào điều khiển được Dimension bằng Lisp ví dụ như scale đường kích thước chẳng hạn
QUẢNG CÁO ĐẦU TRANG
Collapse
Thông báo
Collapse
No announcement yet.
Dxf và Dimension trong AutoCAD
Collapse
X
-
Ðề: Dxf và Dimension trong AutoCAD
Tại sao dung biến hệ thống thì lại bị "STYLE OVERRIDE" vậy, làm cách nào cho nó hết.
((-1 . <Entity name: 7ef7bd38>) (0 . "DIMSTYLE") (105 . "27") (102 .
"{ACAD_REACTORS") (330 . <Entity name: 7ef7f218>) (330 . <Entity name:
7ef7f430>) (330 . <Entity name: 7ef7f4b0>) (330 . <Entity name: 7ef7f538>) (330
. <Entity name: 7ef7f5e8>) (330 . <Entity name: 7ef7f658>) (330 . <Entity name:
7ef7fa30>) (330 . <Entity name: 7ef7fb98>) (102 . "}") (330 . <Entity name:
7ef7bc50>) (100 . "AcDbSymbolTableRecord") (100 . "AcDbDimStyleTableRecord") (2
. "Standard") (70 . 0) (40 . 5.0) (41 . 2.0) (42 . 1.0) (43 . 1.0) (44 . 1.0)
(73 . 0) (74 . 0) (77 . 1) (140 . 2.0) (141 . -2.0) (147 . 1.0) (176 . 256)
(177 . 256) (178 . 2) (271 . 0) (272 . 0) (277 . 6) (340 . <Entity name:
7ef7bf40>) (342 . <Entity name: 7ef7bf10>) (371 . -1) (372 . -1))
trong danh sách trên (40. 5.0) là để thiết lập dimscale của kích thước, nhưng sao không sửa được
(defun C:SK()
(setq SL (tblsearch "dimstyle" "standard"))
(setq new '(40 . 10.0))
(setq old '(40 . 5.0))
(setq SL1 (subst new old SL))
(entmod SL1)
(entupd (tblobjname "dimstyle" "standard"))
)
em viết thử đoạn mã như trên thay được giá trị nhưng không entmod và entupd được, bác dậy chỉ cho em với
-
Ðề: Dxf và Dimension trong AutoCAD
Chào bác em làm được rồi cám ơn bác nha, nhưng bác nên viết lại như thế này thì không bị "style override"
(progn
(setq SL(tblobjname "DIMSTYLE" "standard")
new 10
SL1(entget SL)
old(assoc 40 SL1)
new(cons 40 new)
SL1(subst new old SL1))
(entmod SL1)
(entupd SL)
(command "-DimStyle" "R" "standard")
)
được không bác, nhưng khi Dimscale=1 thì đoạn mã này không chạy được, bác dịnh giải quyết thế nào, Em định như sau:
(setq L1 (entget(tblobjname "dimstyle" "standard")))
((-1 . <Entity name: 7ef7bd38>) (0 . "DIMSTYLE") (105 . "27") (102 .
"{ACAD_REACTORS") (330 . <Entity name: 7ef7f218>) (330 . <Entity name:
7ef7f430>) (330 . <Entity name: 7ef7f4b0>) (330 . <Entity name: 7ef7f538>) (330
. <Entity name: 7ef7f5e8>) (330 . <Entity name: 7ef7f658>) (102 . "}") (330 .
<Entity name: 7ef7bc50>) (100 . "AcDbSymbolTableRecord") (100 .
"AcDbDimStyleTableRecord") (2 . "Standard") (70 . 0) (41 . 1.0) (42 . 1.0) (43
. 1.0) (44 . 1.0) (73 . 0) (74 . 0) (77 . 1) (140 . 2.0) (141 . -2.0) (147 .
1.0) (176 . 256) (177 . 256) (178 . 2) (271 . 0) (272 . 0) (277 . 6) (340 .
<Entity name: 7ef7bf40>) (342 . <Entity name: 7ef7bf10>) (371 . -1) (372 . -1))
(setq L2 (tblsearch "dimstyle" "standard"))
((0 . "DIMSTYLE") (2 . "Standard") (70 . 0) (3 . "") (4 . "") (5 . "Dot") (6 .
"") (7 . "") (40 . 1.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (44 . 1.0) (45 . 0.0)
(46 . 0.0) (47 . 0.0) (48 . 0.0) (140 . 2.0) (141 . -2.0) (142 . 0.0) (143 .
25.4) (144 . 1.0) (145 . 0.0) (146 . 1.0) (147 . 1.0) (71 . 0) (72 . 0) (73 .
0) (74 . 0) (75 . 0) (76 . 0) (77 . 1) (78 . 0) (170 . 0) (171 . 2) (172 . 0)
(173 . 0) (174 . 0) (175 . 0) (176 . 256) (177 . 256) (178 . 2) (270 . 8) (271
. 0) (272 . 0) (273 . 2) (274 . 2) (340 . <Entity name: 7ef7bf40>) (275 . 0)
(280 . 0) (281 . 0) (282 . 0) (283 . 1) (284 . 0) (285 . 0) (286 . 0) (287 . 3)
(288 . 0))
sau đó bỏ phần gạch chân đi, rồi nối 2 list lại với nhau, nhưng em thử mãi không dùng được hàm member vơi L1 nó toàn báo nill thôi, thế là bị làm sao
Ghi chú
-
Ðề: Dxf và Dimension trong AutoCAD
(defun C:KT()
(setq KEYWORD '(2 . "Standard"))
(setq LISTSEARCH (tblsearch "dimstyle" "standard"))
(setq LISTSEARCH (member KEYWORD LISTSEARCH))
(setq LISTOBJNAME (entget(tblobjname "dimstyle" "standard")))
(setq LISTOBINAME1 (reverse LISTOBJNAME))
(setq LISTOBJNAME (member KEYWORD LISTOBINAME1))
(setq LISTOBJNAME1 (cdr LISTOBJNAME))
(setq N (length LISTOBJNAME1))
(setq LISTDIM LISTSEARCH)
(setq N1 0)
(while (<= N1 (- N 1))
(setq L1 (nth N1 LISTOBJNAME1))
(setq LISTDIM (cons L1 LISTDIM))
(setq N1 (1+ N1))
)
(setq LISTDIMENSION LISTDIM)
(setq DIMNAME(tblobjname "DIMSTYLE" "standard")
new 3
old(assoc 40 LISTDIMENSION)
new(cons 40 new)
LISTDIMENSION (subst new old LISTDIMENSION))
(entmod LISTDIMENSION)
(entupd DIMNAME)
(command "-DimStyle" "R" "standard")
)
Bác kiểm tra hộ em nó chạy thế nào cái nha, có vẻ được đấy nhưng không biết nó còn có lỗi gì không
Ghi chú
-
Ðề: Dxf và Dimension trong AutoCAD
(defun C:TRUCSO()
(setq TEXTHEIGH 2.1)
(setq DRAWINGSCALE (getreal "\nDrawing Scale(1/N): "))
(setq RADIUS (* (/ 1 DRAWINGSCALE) TEXTHEIGH))
(setq SO 1)
(while
(setq PT (getpoint "\nInsert Point or Enter Exit: "))
(progn
(setq HS (cal "1/3"))
(setq X (nth 0 PT)
Y (nth 1 PT)
Z (nth 2 PT)
)
(setq PT1
(list X (- Y (* HS 2 RADIUS)) Z)
)
(setq PTC
(list X (- Y (+ (* HS 2 RADIUS)) RADIUS) Z)
)
(setq LISTBLOCK (list '(0 . "BLOCK")
'(2 . "TRUC")
'(70 . 66)
(cons 10 PT)
)
)
(setq LISTLINE (list '(0 . "LINE") (cons 10 PT1) (cons 11 PT)))
(setq LISTCIRCLE '((0 . "CIRCLE") (10 0 0 0) (40 . 0.5)))
(setq
OLD (assoc 40 LISTCIRCLE)
NEW (cons 40 RADIUS)
LISTCIRCLE (subst NEW OLD LISTCIRCLE)
OLD (assoc 10 LISTCIRCLE)
NEW (cons 10 PTC)
LISTCIRCLE (subst NEW OLD LISTCIRCLE)
)
(setq LISTTEXT
'((0 . "TEXT")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "GhiChu")
(100 . "AcDbText")
(10 4178.87 4320.61 0.0)
(40 . 63.0)
(1 . "A")
(50 . 0.0)
(41 . 0.7)
(51 . 0.0)
(7 . "RomanS")
(71 . 0)
(72 . 1)
(11 4502.27 4352.11 0.0)
(210 0.0 0.0 1.0)
(73 . 2)
)
)
(setq OLD (assoc 40 LISTTEXT)
NEW (cons 40 RADIUS)
LISTTEXT (subst NEW OLD LISTTEXT)
)
(setq OLD (assoc 11 LISTTEXT)
NEW (cons 11 PTC)
LISTTEXT (subst NEW OLD LISTTEXT)
)
(setq OLD (assoc 1 LISTTEXT)
NEW (cons 1 (rtos SO 2 0))
LISTTEXT (subst NEW OLD LISTTEXT)
)
(entmake LISTBLOCK)
(entmake LISTLINE)
(entmake LISTCIRCLE)
(entmake LISTTEXT)
(entmake '((0 . "ENDBLK")))
(setq LISTINSERT
(list '(0 . "INSERT") '(2 . "TRUC") (cons 10 PT))
)
(entmake LISTINSERT)
(princ)
(setq SO (1+ SO))
)
)
)
Bác Lam ơi, đoạn mã để tạo ra trục số viết thế được chưa vậy, em muốn hỏi bác có làm cách nào để thay đoạn mã
(setq OLD (assoc 11 LISTTEXT)
NEW (cons 11 PTC)
LISTTEXT (subst NEW OLD LISTTEXT)
bằng hàm
(defun MODIFYLIST(LST CODE CODEVALUE)
(setq OLD(assoc CODE LST)
NEW(cons CODE CODEVALUE)
LST (subst NEW OLD LST))
không,
ví dụ như hàm MODIFYLIST trên thì biến LST, CODE, CODEVALUE là biến tổng thể phải không, em vẫn còn lơ mơ mấy cái kiểu biến này quá, mà hình như LISP không có kiểu hàm giá trị nhỉ như FUNCTION trong VB vậy mà toàn kiểu SUB thôi đúng không
Có thể dùng thủ tục của file LISP này dùng cho file LISP khàch không
Em có ý thế này mình sẽ lưu các LIST của một số đối tượng CAD lúc cần thì lôi ra và sửa mấy cái mã cần thôi được không bácLast edited by Mylove; 21-05-2005, 10:30 AM.
Ghi chú
-
Ðề: Dxf và Dimension trong AutoCAD
(defun ModifyList(LST Code CodeValue)
(setq Old(assoc Code LST)
New(cons Code CodeValue)
LST (subst New Old LST))
)
(defun C:TITLE()
;;; (setq PT(getpoint "\nInsert Point: "))
;;; (setq DRWSCALE(getreal "\Drawing Scale: "))
(setq ListTextTitle
'((0 . "TEXT")
(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "GhiChu") (62 . 113)
(100 . "AcDbText") (10 3002.63 271.747 0.0) (40 . 630.0) (1 . "BA/RNG THO/M/SNG KE/M KHO/M/SI L/}/{/JNG")
(50 . 0.0) (41 . 0.7) (51 . 0.0) (7 . "RomanD") (71 . 0) (72 . 1)(73 . 0)
(11 8158.13 271.747 0.0) (210 0.0 0.0 1.0)))
;;; (setq Old(assoc 40 ListTextTitle)
;;; New(cons 40 1000)
;;; ListTextTitle (subst New Old ListTextTitle))
(ModifyList ListTextTitle 40 1000)
;;; (entmake ListTextTitle)
)
Bác Lam xem hộ em một cái, nó không chịu chạy gì cả, Khi ModifyList thì được nhưng khi dùng hàm entmake thì mã 40 vẫn có giá trị là 630 chứ không phải 1000, thế nghĩa là sao
Ghi chú
-
Ðề: Dxf và Dimension trong AutoCAD
Bác ơi đấy là trường hợp chương trình này dùng hàm ListTextTitle thế còn khi chương trình dùng tên khác ListTextTitle thi làm thế nào, hình như viết như thế thì hàm ModifyList này không được tổng quát cho lắm đúng không
Ghi chú
-
Ðề: Dxf và Dimension trong AutoCAD
Bác Lam ơi làm cách nào để khi minh ấn TAB hoặc ENTER thì hộp EDIT BOX nhận giá trị không, ví dụ như mình đánh 10/2 vào EDITBOX1 sau đó ấn ENTER hoặc TAB thì nó nhẩy sang EDITBOX2 và nó hiển thị trong EDITBOX1 là 5 không giống như Sap2000v8 ấy
Ghi chú
-
Ðề: Dxf và Dimension trong AutoCAD
(defun C:KT()
(setq LISTSEARCH (tblsearch "dimstyle" "standard"))
(setq KEYWORD (assoc 2 LISTSEARCH))
(setq LISTSEARCH (member KEYWORD LISTSEARCH))
(setq LISTOBJNAME (entget(tblobjname "dimstyle" "standard")))
(setq LISTOBINAME1 (reverse LISTOBJNAME))
(setq LISTOBJNAME (member KEYWORD LISTOBINAME1))
(setq LISTOBJNAME1 (cdr LISTOBJNAME))
(setq N (length LISTOBJNAME1))
(setq LISTDIM LISTSEARCH)
(setq N1 0)
(while (<= N1 (- N 1))
(setq L1 (nth N1 LISTOBJNAME1))
(setq LISTDIM (cons L1 LISTDIM))
(setq N1 (1+ N1))
)
(setq LISTDIMENSION LISTDIM)
(setq DIMNAME(tblobjname "DIMSTYLE" "standard")
new "Oblique"
old(assoc 5 LISTDIMENSION)
new(cons 5 new)
LISTDIMENSION (subst new old LISTDIMENSION))
(entmod LISTDIMENSION)
(entupd DIMNAME)
(command "-DimStyle" "R" "standard")
)
- Bác Lam ơi xem lại hộ em cái hàm này nhé, sao dùng được cho mã số 40 mà không dùng được cho mã số 5 này vậy
- Mà hàm này có thể dùng cho tất cả các mã chưa
Ghi chú
-
Ðề: Dxf và Dimension trong AutoCAD
Nguyên văn bởi nglam_adg.....
.......
Nếu làm được với ObjectARX thì rất hay nhưng hạn chế lớn nhất là khả năng tương thích và support cho từng phiên bản AutoCAD. Bạn chịu khó đọc Help vì giải thích thì dài lắm. Ở Hà nội, tôi mới chỉ thấy ObjectARX support AutoCAD 2000 và AutoCAD 2002.
Trong CAD 14, ObjectArx đã được giới thiệu, và càng ngày càng hoàn thiện.
Để biết thêm thông tin về ObjectArx, bạn có thể vào mục " ObjectArx ... có ai quan tâm, ngay trong diễn đàn này". Hoặc nếu muốn tường tận hơn, vào trang : objectarx.com . Bạn có thể tải SDK cho các phiên bản CAD 2004,2005,2006 . Ngôn ngữ lập trình : C++, viết trong Visual Studio 2002 . Nếu bạn quan tâm thì hãy lên tiếng, mình sẽ hướng dẫn cụ thể từ đầu.
Ghi chú
-
Ðề: Dxf và Dimension trong AutoCAD
Load các modul .arx từ các dòng lisp là cách làm thông dụng nhất mà những người phát triển bằng arx hay làm. Kịch bản thông dụng thường là:
Dùng Lisp để nạp các menu, command...khi CAD khởi động --> Các arx cần thiết sẽ được gọi, kích hoạt...thông qua các menu, command đã nạp từ trước.
Lưu ý: Với .NET modul, hiện tại chỉ có thể nạp thông qua một kịch bản duy nhất: thông qua lệnh NETload của CAD ---> chọn modul cần load(file .dll). Do AutoCAD.NET APIs hiện tại chưa hỗ trợ "remote control"...nên chưa thể load tự động các modul .NET khi cad khởi động.
Ghi chú
Quảng cáo cuối trang
Collapse
Ghi chú