Jump to content
InfoFile
Tác giả: phamngoctukts
Bài viết gốc: 139530
Tên lệnh: tag
Viết lisp theo yêu cầu [phần 2]

Của bạn đây

Filename: 139530_tag.lsp
Tác giả: hanam1210
Bài viết gốc: 173673
Tên lệnh: lo
lisp vẽ line !

Cái lisp này em viết nhằm mục đích vẽ ra 1 line trong các trường hợp riêng phục vụ cho vẽ và tính taluy san nền.
Cụ thể theo yêu cầu:
+ Lisp lấy giá trị từ text có sẵn ( giá trị là A) và vẽ ra line theo cách pcik điểm P1 và P2 , nó sẽ vẽ ra đoạn P1P2 thuộc layer GRID_TL có màu 3 và chiều dài đoạn P1P2 =kc được tính trong các trường hợp sau:
TH1: nếu A< -7, kc= A*Kđào +( phần...
>>
Cái lisp này em viết nhằm mục đích vẽ ra 1 line trong các trường hợp riêng phục vụ cho vẽ và tính taluy san nền.
Cụ thể theo yêu cầu:
+ Lisp lấy giá trị từ text có sẵn ( giá trị là A) và vẽ ra line theo cách pcik điểm P1 và P2 , nó sẽ vẽ ra đoạn P1P2 thuộc layer GRID_TL có màu 3 và chiều dài đoạn P1P2 =kc được tính trong các trường hợp sau:
TH1: nếu A< -7, kc= A*Kđào +( phần nguyên của A/7 )*2
TH2: nếu -7 < A < 0, kc= A*Kđào
TH3: nếu 0<A< 7, kc= A*1.5
TH4: nếuA >7, kc= A*1.5 +( phần nguyên của A/5 )*2
D­ưới đây là phần code mà e đã loay hoay viết. Đợt trước nó chạy được. Nhưng đợt này bị lỗi mất trường hợp -7< A <7 không hiểu vì sao. Các anh trên diễn đàn hoàn thiện hoặc viết mới giúp em để nó không bị lỗi nữa ạ. EM xin cảm ơn !
Hệ số Kđào trong lisp của em viết để mặc định bằng 1, Các anh bổ sung nó giúp em với ạ, K đào do người dùng chỉ cần nhập vào một lần trong cả bản vẽ đó trong mỗi lần mở lên
.Giống đoạn code này sao ý:
(if (= Ty_le nil) (progn
(setq Ty_le (getreal "\n Kđào"))
(setq He_so (/ 1 Ty_le))
(setq He_so2 (* He_so He_so))
)
)


(defun c:lo (/ kc kc1 ot k1)
(command "layer" "N" "GRID_TL" "S" "GRID_TL" "color" 3 "" "")
(repeat 10000
(setq p1 (getpoint "\n Pick diem: "))
(setq p2 (getpoint "\n Pick diem: "))
(setq kc (entget (car (entsel "\n Chenh cao: "))))
(setq otext (assoc 1 kc))
(setq ot (cdr otext))
(setq ot (read (substr ot 1)))
(setq g (angle p1 p2))
(if (< ot -7)
(progn
(setq KC1 (* (abs ot) 1))
(setq k1 (* 2 (fix (/ (abs ot) 5))))
(setq KC1 (+ k1 KC1))
(setq p3 (polar P1 G KC1))
(command "line" p1 p3 "")
)
)
(if (and (< ot 0) (> ot -7))
(progn
(setq KC1 (* (abs ot) 1))
(setq k1 (* 2 (fix (/ (abs ot) 5))))
(setq KC1 (+ k1 KC1))
(setq p3 (polar P1 G KC1))
(command "line" p1 p3 "")
)
)
(if (and (> ot 0) (< ot 7))
(progn
(setq kc1 (* ot 1.5))
(setq p3 (polar P1 G KC1))
(command "line" p1 p3 "")
)
)
(if (> ot 7)
(progn
(setq KC1 (* (abs ot) 1))
(setq k1 (* 2 (fix (/ (abs ot) 5))))
(setq KC1 (+ k1 KC1))
(setq p3 (polar P1 G KC1))
(command "line" p1 p3 "")
)
)

(princ)
)

)

<<

Filename: 173673_lo.lsp
Tác giả: Doan Van Ha
Bài viết gốc: 173682
Tên lệnh: lo
lisp vẽ line !


Nói chung, Lisp của bạn còn nhiều điều phải bàn tới:
1). Nếu có tới 4 trường hợp như thế thì nên dùng hàm cond chứ không nên dùng hàm if.
2). Các trường hợp bạn xét là chưa đủ, như khi dấu "=" xãy ra thì sao.
3). Không nên dùng hàm repeat mà nên dùng while.
4). Thiếu đặt osnap nên bạn bị lỗi...
Nhưng mới viết và mày mò đến tận 3h sáng thì bạn sẽ tiến...
>>

Nói chung, Lisp của bạn còn nhiều điều phải bàn tới:
1). Nếu có tới 4 trường hợp như thế thì nên dùng hàm cond chứ không nên dùng hàm if.
2). Các trường hợp bạn xét là chưa đủ, như khi dấu "=" xãy ra thì sao.
3). Không nên dùng hàm repeat mà nên dùng while.
4). Thiếu đặt osnap nên bạn bị lỗi...
Nhưng mới viết và mày mò đến tận 3h sáng thì bạn sẽ tiến triển không lâu nữa.
Tôi tạm sửa cho bạn như dưới đây. Nếu có gì chưa ưng ý thì post lên nhé.
Thân thương!

<<

Filename: 173682_lo.lsp
Tác giả: ketxu
Bài viết gốc: 173774
Tên lệnh: inn
Chèn nút lên *Line tại các điểm chèn Block



- Có thảo luận và nhiều phiên bản trong Topic gốc, các bạn vào để biết rõ hơn. Ketxu trích dẫn cái Lisp v1


Filename: 173774_inn.lsp
Tác giả: phamthanhbinh
Bài viết gốc: 117792
Tên lệnh: gtxt
Viết lisp theo yêu cầu [phần 2]

Chào bạn Truongthanh,
Bạn dùng thử lisp này coi sao. Do mình mới viết vội nên chưa hoàn chỉnh lắm, bạn dùng thử và cho ý kiến để mình hoàn chỉnh lại.

Chúc bạn vui.

Filename: 117792_gtxt.lsp
Tác giả: phamthanhbinh
Bài viết gốc: 118094
Tên lệnh: dtm
Viết lisp theo yêu cầu [phần 2]
Chào bạn phongthien,
Bạn cần cái này phải không???
(Vì không mở được bản vẽ bạn gửi nên đành đoán mó mà làm, hề hề hề)

Filename: 118094_dtm.lsp
Tác giả: phamngoctukts
Bài viết gốc: 118360
Tên lệnh: nline
Viết lisp theo yêu cầu [phần 2]

Mình mới viết được cho bạn như thế này. Lisp chạy hơi chậm bạn chịu khó đợi nhé. Bạn test thử rồi cho ý kiến để bổ xung. Do mình không có thời gian nên chưa nghiên cứu sâu được.

Filename: 118360_nline.lsp
Tác giả: phamthanhbinh
Bài viết gốc: 118361
Tên lệnh: tkqh
Viết lisp theo yêu cầu [phần 2]

Chào bạn phongthien,
Bạn dùng thử cái này coi, có gì chưa ổn hãy post lên để mình xem lại.

Chúc bạn vui.

Filename: 118361_tkqh.lsp
Tác giả: phamthanhbinh
Bài viết gốc: 118987
Tên lệnh: mt2t
Viết lisp theo yêu cầu [phần 2]

Hề hề hề,
Ây da, khổ quá, lần mò mãi mới nghĩ ra được cái củ chuối này. Các bạn xài thử và cho ý kiến để mình hoàn thiện nó nhé.
Vấn đề khó khăn nhất ở đây là cái font tiếng Việt của các bạn. Trong Mtext thì nó cho ghi cả các mã font, nhưng sang Text thì nó chả hiểu cái mã font là chi. Vì thế khi nổ thành text thì nó chỉ còn là các ký tự. Mình chịu chết không mò ra...
>>

Hề hề hề,
Ây da, khổ quá, lần mò mãi mới nghĩ ra được cái củ chuối này. Các bạn xài thử và cho ý kiến để mình hoàn thiện nó nhé.
Vấn đề khó khăn nhất ở đây là cái font tiếng Việt của các bạn. Trong Mtext thì nó cho ghi cả các mã font, nhưng sang Text thì nó chả hiểu cái mã font là chi. Vì thế khi nổ thành text thì nó chỉ còn là các ký tự. Mình chịu chết không mò ra được cái quy luật để chuyển các ký tự trong mã text tiếng Việt. Cũng may là trên bản vẽ của bạn lacvanhoa gửi có text tiếng việt cùng một style với mtext. Vì thế mình làm kiểu củ chuối là lấy các mã text trong text nhập vào mã text trong mtext bị nổ ra thế là được. Tuy nhiên vì bạn lacvanhoa chỉ gửi có mỗi cái text đã chuyễn là nguyễn kim hường nên mình chỉ biết có hai mã là mã của chữ ễ và chữ ườ, còn các mã khác thì tịt ngóm nên cái lisp này mới chỉ thành công với các trường hợp text có chứa chữ ễ và chữ ườ thôi. Các trường hợp khác thì các bạn gửi mình các text khác mình mới làm tiếp được. Cái kiểu này quả là rất củ chuối vì trong tiếng việt có bao nhiêu là trường hợp bỏ dấu, và như vậy thì phải có đủ các mã ấy mới ăn thua. Tuy nhiên bí quá thì phải cố rặn ra vậy nên mình mới nghĩ được đến đây. Có ai khác có cách hay hơn thì tốt quá. Mình cứ gửi lên để các bạn tham khảo và xài tạm cho đỡ sốt ruột vậy. Hề hề hề.....

PS: Về vị trí của các text sau khi chạy lisp nó chưa thẳng hàng là do cái việc căn text của thằng Mtext ấy mà. Xử lý cho nó thẳng lại không quá khó nhưng do chưa biết các Mtext ban đầu có thống nhất kiểu căn text không nên mình chưa chỉnh sửa. Mặt khác mình cũng chưa xét tới trường hợp các Mtext nằm xiên khoai hay nằm đứng. Điều này cũng có thể giải quyết được nếu như các bạn chấp nhận xơi cái củ chuối của mình. Hề hề hề. Đây mới chỉ là cái ý tưởng giải quyết vấn đề chứ chưa phải cái kết quả cuối cùng, mong các bạn chớ giận cái củ chuối này của mình . Ý tưởng chưa hay, xong mình cũng chưa tìm ra giải pháp nào hữu hiệu hơn, Mong các bạn thông cảm.
Khi chạy thử, hãy chọn các mtext có chữ ễ và chữ ườ chạy trước để kiểm tra nhé. Mtext nằm kiểu chi nó cũng chạy ra text nằm ngang phè phè, đừng có cười nhé.....
<<

Filename: 118987_mt2t.lsp
Tác giả: Tue_NV
Bài viết gốc: 62488
Tên lệnh: doir
Thay đổi bán kính nhiều circle

Sử dụng Quick Select hoặc filter và kết hợp Ctrol + 1 -> Trong nhãn Geometry -> Chỉnh Radius

Hai lệnh Quick Select và filter bạn có thể tìm trên diễn đàn. Cái này đã có nói rồi, nhiều lắm

Còn bạn muốn sử dụng Lisp thì đây :


:s_big:

Filename: 62488_doir.lsp
Tác giả: ketxu
Bài viết gốc: 139074
Tên lệnh: me3
Measure nhiều đối tượng

Bạn hãy kích nút thank động viên bạn ấy kèm theo lời nói :)
Mình cũng góp cái lisp vừa nãy thảo, không đc chi tiết như bạn HHVD viết

Filename: 139074_me3.lsp
Tác giả: Doan Van Ha
Bài viết gốc: 173821
Tên lệnh: lo
lisp vẽ line !

Đây là lisp viết theo diễn giải, không viết theo lisp bạn ấy post lên (vì mâu thuẩn nhau), chỉ có 1 thắc mắc: cái "A" để tính kc là A hay (abs A) nên tạm lấy (abs A) vậy, nếu không đúng thì sửa lại vậy.

Filename: 173821_lo.lsp
Tác giả: boy8x
Bài viết gốc: 173948
Tên lệnh: r
Nhờ các anh trên diễn đàn sửa lisp tính diện tích !
Em có cái Lisp pick diện tích trên cad và ghi kết quả vào text sẵn có, Nhưng do nhu cầu công việc. Tại bài toán cụ thể này thì lại cần cộng thêm giá trị diện tích vừa pick được vào text sẵn có. Các anh chỉnh sửa giúp em được không ạ ? em xin chân thành cảm ơn !


(defun c:r()
(if (= Ty_le nil) (progn
(setq Ty_le (getreal "\n Ty le ban ve 1:X , X=?:"))
(setq He_so (/ 1...
>>
Em có cái Lisp pick diện tích trên cad và ghi kết quả vào text sẵn có, Nhưng do nhu cầu công việc. Tại bài toán cụ thể này thì lại cần cộng thêm giá trị diện tích vừa pick được vào text sẵn có. Các anh chỉnh sửa giúp em được không ạ ? em xin chân thành cảm ơn !


(defun c:r()
(if (= Ty_le nil) (progn
(setq Ty_le (getreal "\n Ty le ban ve 1:X , X=?:"))
(setq He_so (/ 1 Ty_le))
(setq He_so2 (* He_so He_so))
)
)
(setq dtl 0)
(setq ss (ssadd))
(setq oslast (getvar "OSMODE"))
(command "osnap" "")
(print)
(print)
(setq pt1 (getpoint "\nPick internal point : "))
(while (/= pt1 nil)
(command "-boundary" pt1 "")
(setq et (entlast))
(ssadd et ss)
(command "area" "e" "last")
(command "dimzin" "0" "")
(setq vsize ( /(getvar "VIEWSIZE") 300 ))
(command "hatch" "ANSI31" vsize "0" "last" "")
(setq et (entlast))
(ssadd et ss)
(setq dtcon (getvar "AREA"))
(setq dtl (+ dtcon dtl))
(print)
(print)
(setq pt1 (getpoint "\nPick internal point : "))
)
(command "setvar" "OSMODE" oslast)
(command "erase" ss "")
(setq ss nil)
(command "redraw")
(setq dtl (/ (/ dtl He_so2) 1))
(prompt (strcat "\nDien tich = " (rtos dtl 2 2)))
(setq en (car (entsel "\nSelect text : ")))
(command "_.change" en "" "P" "C" "6" "")
(setq elst (entget en))
(setq elst (subst (cons 1 (strcat " " (rtos dtl 2 2))) (assoc 1 elst) elst))
(entmod elst)

);defun

<<

Filename: 173948_r.lsp
Tác giả: ndtnv
Bài viết gốc: 72055
Tên lệnh: mplota
Với MPLot


MPlot: In hàng loạt bản vẽ trong cửa sổ hình chữ nhật
Dùng để in r hàng, c cột bản vẽ kích thước như nhau. Bản đầu tiên từ vị trí x0, y0
Kích thước mỗi cửa sổ rộng w, cao h. Khoảng cách các cửa sổ theo phương x là dw, phương y là dh


Hoặc dùng kiểu load trực tiếp code từ cửa sổ lisp
(MPlot 2 3 0 0 42000.0 59400.0 42000.0 59400.0)

Filename: 72055_mplota.lsp
Tác giả: Doan Van Ha
Bài viết gốc: 173927
Tên lệnh: lo
lisp vẽ line !

Đây bạn!

Filename: 173927_lo.lsp
Tác giả: Nguyen Hoanh
Bài viết gốc: 4814
Tên lệnh: lokhoan
lisp vẽ lỗ khoan

sorry!

tôi nhầm!
Đoạn lisp trên cần sửa lại một chút.
Mã lệnh (abs (- r1 r2)) cần phải sửa thành (- r1 r2) tức là bỏ hàm abs đi. Như vậy thì sẽ đúng trong mọi trường hợp.

Mã lệnh mới như sau:

Filename: 4814_lokhoan.lsp
Tác giả: thiep
Bài viết gốc: 69800
Tên lệnh: vbu
Viết Lisp theo yêu cầu

Chào conghoan1003 và Tue_NV,
Thiep cũng có một thời gian làm việc cùng với Bảm đảm An toàn Hàng Hải II, nạo vét luồng SG - Vũng Tàu từ Tân Cảng đến Ghềnh Rái, Người ta nạo vét đến cots 8.2m sai số 0.3m (mốc cao độ Mũi Nai). Còn yêu cầu của Conghoan thi vét bùn theo bề mặt địa hình tự nhiên rồi offset xuống, lại không có sai số nạo vét!
Thôi thì cũng theo yêu cầu này, Thiep xin...
>>

Chào conghoan1003 và Tue_NV,
Thiep cũng có một thời gian làm việc cùng với Bảm đảm An toàn Hàng Hải II, nạo vét luồng SG - Vũng Tàu từ Tân Cảng đến Ghềnh Rái, Người ta nạo vét đến cots 8.2m sai số 0.3m (mốc cao độ Mũi Nai). Còn yêu cầu của Conghoan thi vét bùn theo bề mặt địa hình tự nhiên rồi offset xuống, lại không có sai số nạo vét!
Thôi thì cũng theo yêu cầu này, Thiep xin gánh cho Tue một chút tạo ra lisp như ý muốn của CongHoan:

<<

Filename: 69800_vbu.lsp
Tác giả: Doan Van Ha
Bài viết gốc: 173233
Tên lệnh: sct
Sửa Lisp xoay thành scale đối tượng tại tâm

Trong lúc bác Tue_NV đi vắng, tạm thời giúp bạn vậy. Lisp này scale các loại đối tượng: Circle, Block, Donut, Rectangle.

Filename: 173233_sct.lsp
Tác giả: Nguyen Hoanh
Bài viết gốc: 4805
Tên lệnh: lokhoan
lisp vẽ lỗ khoan
* Lisp của bạn chạy tốt, thuật toán sai.
Vì thế chịu, phải viết lại thôi.

* Đây là bài toán hình học không hề đơn giản. Mấu chốt bài toán là làm sao để vẽ được đường bao của nó. còn hai vòng tròn nhỏ bên trong thì chỉ là mắt muỗi thôi.

* tạm thời, đặt tên hình như sau:
http://img.photobucket.com/albums/v672/nguyenhoanh/vlkhoan.gif

* Ta phải xác định...
>>
* Lisp của bạn chạy tốt, thuật toán sai.
Vì thế chịu, phải viết lại thôi.

* Đây là bài toán hình học không hề đơn giản. Mấu chốt bài toán là làm sao để vẽ được đường bao của nó. còn hai vòng tròn nhỏ bên trong thì chỉ là mắt muỗi thôi.

* tạm thời, đặt tên hình như sau:
http://img.photobucket.com/albums/v672/nguyenhoanh/vlkhoan.gif

* Ta phải xác định được các toạ độ p3, p4, p5, p6, p7, p8 từ các toạ độ p1, p2 và hai bán kính r1 và r2. Để từ đó lần lượt vẽ các đoạn thẳng p3-p4, p5-p6 và các cung tròn p3-p7-p5 và p4-p8-p6.

* Để xác định điểm các điểm này, ta sẽ xác định thông qua khoảng cách tương đối với các điểm gốc p1, p2 và các góc tương đối giữa vectơ tạo bởi chúng và hai điểm này với trục x. Tóm lại, chúng ta sẽ xác định toạ độ của chúng thông qua các hệ toạ độ cực với tâm toạ độ lần lượt là p1 và p2.

* Để xác định p3:
- cần xác định góc p1,p3.
- Để xác định góc p1,p3 ta thấy góc này bằng góc tuyệt đối giữa p1, p2 cộng thêm góc p2-p1-p3 (tạm đặt tên là g).
- g=arctan(b/a).
- a = r1-r2.
- b = căn bậc hai của bình phương cạnh huyền l trừ đi bình phương của a.
- l là khoảng cách giữa p1 và p2

* Tương tự như vậy với các đỉnh còn lại.

* Và như vậy, mã lệnh lisp sẽ là:

<<

Filename: 4805_lokhoan.lsp
Tác giả: ketxu
Bài viết gốc: 127619
Tên lệnh: tcd
Viết lisp theo yêu cầu [phần 2]

Nếu các text lúc nào cũng nằm ngang thì bạn dùng thử cái này nhé.Hy vọng bạn bỏ chút thời gian nghiên cứu lisp để tự xây dựng những đoạn code nhỏ nhỏ cho mình :)
P/S : Trong code bạn post, mình không thấy có phần nào can thiệp vào OSnap mode cả, có thể là do đoạn khác bạn à.Mà nếu lúc chọn...
>>

Nếu các text lúc nào cũng nằm ngang thì bạn dùng thử cái này nhé.Hy vọng bạn bỏ chút thời gian nghiên cứu lisp để tự xây dựng những đoạn code nhỏ nhỏ cho mình :)
P/S : Trong code bạn post, mình không thấy có phần nào can thiệp vào OSnap mode cả, có thể là do đoạn khác bạn à.Mà nếu lúc chọn điểm mà tắt Ónap đi thì nghe cũng khó :)

<<

Filename: 127619_tcd.lsp

Trang 56/330

56