Chuyển đến nội dung
Diễn đàn CADViet
Nguyen Hoanh

Viết Lisp theo yêu cầu

Các bài được khuyến nghị

Bác Nguyễn Hoành, bác SSG và ... ơi. Em mới kiếm được một cái thư viện dành cho dân kiến trúc "công nhận nó khá tuyệt vời." Nhưng người chia sẻ em cái thư viện này, lại không truyền lại bí kíp tạo ra bộ thư viện đó. Thật sự, em mò mãi mà vẫn chưa ra, hum nay, có gì em sẽ Up lên diễn đàn aem xem có gì tìm hiểu thêm xem họ tạo ra bộ thư viện này bằng cách nào nha. " Công công ty mà đã tạo ra bộ thư viện này là công ty PAD, khá nổi ở Sài Gòn" có gì em cũng sẽ up lên topic thư viện or dowload của diễn đàn lun. Học hỏi và chép trên này nhìu, mà chưa có dịp nào ... Thank các bác nhìu nhìu.

Còn đây là một file của em nó.

Visit My Website

rút kinh nghiệm lần trước, em save file nó xuống cad 200o rùi đó.

chào các bác (xin bàn ngoài lisp 1 chút xíu), em xin có 1 chút gợi ý theo cách hiểu của em về vấn đề này như sau: trong cái file cad mà bác phamthanhhungks đã gửi em đã xem qua, không biết có phải bác nói cái thư viện ấy tuyệt vời ở chỗ tức là các block có thể co kéo 1 cách thoải mái, ví dụ bác muốn bề rộng cửa là 2m thì bác chỉ cần kích vào block đấy và gõ 2 là nó sẽ tự động stretch ra bề rộng 2 m có phải không? Nếu là phải thì những sự tiện lợi đó đều do chức năng tạo block của cad 2007 có được. Bây giờ bác cứ kích kép vào 1 block như thế và khi cái hộp thoại edit block defeniton nó hiện ra bác hãy nhấn ok, nó sẽ mở ra 1 cửa sổ mới cho bác sửa cái block này. Trong phần này bác có thể chuyển nền thành black để dễ thao tác như trong model bằng cách vào options và chọn display, bác chon black color là xong. Xong rồi, trong cửa sổ này có 1 thanh công cụ rất hay trong đó có các chức năng như stretch, move , scale, rotation... nó gọi cái này là Block authoring panlettes - All panlettes. Bác có thể dùng công cụ này để sửa block 1 cách tuỳ ý. sau khi đã tạo được các block như ý bác hãy chọn nút close bock editor trên thanh tastbar và save block vừa sửa lại là xong. Điều đặc biệt khi sử dụng các block này là mặc dù cùng 1 tên block nhưng khi bác copy và sửa chữa - co kéo các block mới này thì các block cùng tên khác ko bị thay đổi theo. Em cũng mới tìm hiểu về chức năng sửa block này nên vẫn chưa hiểu hêt được nó và các công cụ sử dụng như thế nào,...?! Nếu cao nhân nào biết và chỉ bảo thêm thì thật tuyệt! Em thấy sử dụng chức năng này của block rất tiện lợi và hay. Các bác cho biết thêm thông tin nhé! thanks!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bạn sucuph,

Lisp đầy đủ đây ạ:

(defun c:gocdoc ( / ent p1 cao_text sp ep ang dodoc thap_phan)
(vl-load-com)
(setq ent (entsel "\nChon mai doc:"))
(setq cao_text 0.5
thap_phan 2
p1 (cadr ent)
ent (car ent)
sp (vlax-curve-getStartPoint ent)
ep (vlax-curve-getEndPoint ent)
ang (angle sp ep)
dodoc (* (abs (/ (sin ang) (cos ang))) 100)
dodoc (strcat (rtos dodoc 2 thap_phan) "%"))
(command "_.text" (list (car p1) (+ 5 (cadr p1))) cao_text (/ (* ang 180) pi) (strcat " Do doc mai la " dodoc))
)

 

Bạn lưu ý là khi lisp yêu cầu bạn chọn mái doc thì bạn phải chọn vào đúng mái dốc cần xác định độ dốc chứ không được nhấn enter ngay nha.

Khi góc dốc >pi/2 bạn sẽ thấy text bị lộn ngược và tùy theo ý bạn có thể để nguyên hay rotate nó nhé.

Bạn lưu ý thêm là mình có thay đổi cái cách xác định góc xoay của text do hàm angle trả ra giá trị theo radian mà lệnh text yêu cầu nhập giá trị theo độ.

Trong trường hợp mái dốc của bạn không phải là đường line thì góc ang sẽ là góc của điểm đầu và điểm cuối của đường polyline hay spline đó bạn nhé.

Mình đã chạy thử lisp ngon.

Chúc bạn vui và thành công.

Chào bác phamthanhBinh

Việc đặt cố định điểm ghi Text cố định và chiều cao chữ cố định là hơi bị gò bó, chưa được theo ý muốn của người sử dụng. nên có thêm điểm đặt text và chiều cao chữ thì sẽ hợp ý với nguời sử dụng hơn.

 

Không phải góc dốc lớn hơn >pi/2 bạn sẽ thấy text bị lộn ngược đâu bác Bình ạ mà khi vẽ đường line từ phải qua trái (tức là điểm đầu nằm bên phải, điểm cuối nằm bên trái hay (Xdau>Xcuoi)

thì chắc chắn Text sẽ bị lộn ngược ở cả 2 trường hợp góc dốc >pi/2 và góc dốc nhỏ hơn pi/ 2

Như vậy bác phải bổ sung vào Lisp hàm if :

Nếu Xdau

Nếu Xdau > Xcuoi thì xử lý sao cho Text không bị lộn ngược

 

Bác xem điều đó có đúng không nhé?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bác phamthanhBinh

....

Nếu Xdau < Xcuoi thì làm theo trường hợp trên của bác (Text không bị lộn ngược)

Nếu Xdau > Xcuoi thì xử lý sao cho Text không bị lộn ngược

 

Bác xem điều đó có đúng không nhé?

 

Xin góp một hàm giúp cho "text" lúc nào cũng quay đầu lên trên trong mọi trường hợp. Tôi đã ứng dụng thường xuyên để vẽ text cự li trong bản đổ. Đó là hàm gocve

(defun gocve( goc)

(if (and (> goc 90.0) (< goc 270.0)) (+ goc 180.0) goc)

)

 

Cách dùng như sau : Giả sử vẽ text tại điểm p, độ cao h, góc nghiêng g

(command "_.text" p h (gocve g) text)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bạn nguyenkhoadung98,

Đây là cái lisp mình cải tiến theo cái ý mình nói ở trên. Bạn dùng thử và cho mình biết ý kiến nhé.

(defun c:Lj (/ dt ssdt sodt index ans);;; Make Command

(setq index 0)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun ename (ssdt /);;; Get etype of the object ename
(cdr (assoc '0 (entget ssdt)))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun MoPL (ssdt /);;; Check the open polyline
(= (cdr (assoc '70 (entget ssdt))) 0)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun NoiPL (ssdt /);;; Joint the polyline
(if (MoPL ssdt)
(command ".PEDIT" ssdt "J" (ssget) "" "")

)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun NoiLC (ssdt /);;; Joint the line to polyline
(command ".PEDIT" ssdt "Y" "J" (ssget) "" "")

)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Main (dt / );;; Get object and joint
(setq
dt (entsel)
;;;sodt (sslength dt)
;;;index 0
)
;;;(repeat sodt
(setq
ssdt (car dt)

)
(if (or (= (ename ssdt) "LWPOLYLINE") (= (ename ssdt) "POLYLINE"))
(NoiPL ssdt)
)
(if (or (= (ename ssdt) "LINE") (= (ename ssdt) "ARC"))
(progn
(NoiLC ssdt)
(setq index (1+ index))
)
)
(setq ans (getstring "\nBan muon tiep tuc ? "))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Check (/ans);;; Check continuing condition

(if (= ans "y")
(main dt)

)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(Main dt)
(while (= ans "y")
(check ans)
)
(alert (strcat "Ban da noi " (itoa index) " Line thanh Plolyline")) 

(princ)
)

Lệnh sử dụng là LJ (line joint) bạn nhé.

cảm ơn bạn nhiều lắm. mình đã dùng thử nhưng mà lệnh này nó bắt mình phải chọn những 2 lần các đoạn thẳng cần nối, đầu tiên phải chọn sau đó đánh lệnh LJ sau đó lại chọn lại các đoạn cần nối, :undecided: liệu có cách nào chỉ cần đánh lệnh rồi chọn và enter là đuợc kô vậy bạn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Xin góp một hàm giúp cho "text" lúc nào cũng quay đầu lên trên trong mọi trường hợp. Tôi đã ứng dụng thường xuyên để vẽ text cự li trong bản đổ. Đó là hàm gocve

(defun gocve( goc)

(if (and (> goc 90.0) (

)

 

Cách dùng như sau : Giả sử vẽ text tại điểm p, độ cao h, góc nghiêng g

(command "_.text" p h (gocve g) text)

Chào các bác Tdvn và Tue_nv,

Đúng như các bác đã góp ý, cái này là do trình độ của mình còn non nên chưa thực sự hiểu hết về các thuộc tính của các hàm (command...). Xin chân thành cám ơn sự góp ý của các bác và mình sẽ hoàn thiện thêm cái lisp này theo chỉ dẫn của các bác rồi sẽ post lên nhờ các bác chỉ bảo tiếp. Tuy nhiên, bữa nay suýt 8-3 nên mình có tí việc chưa sửa ngay được, mong các bác thông cảm nhé.

Rất mong được sự quan tâm chỉ bảo thêm của các bác để mình tự hoàn thiện bản thân.

Chúc các bác luôn vui khỏe và yêu đời, yêu người và yêu ....mình.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
cảm ơn bạn nhiều lắm. mình đã dùng thử nhưng mà lệnh này nó bắt mình phải chọn những 2 lần các đoạn thẳng cần nối, đầu tiên phải chọn sau đó đánh lệnh LJ sau đó lại chọn lại các đoạn cần nối, :undecided: liệu có cách nào chỉ cần đánh lệnh rồi chọn và enter là đuợc kô vậy bạn

Bận quá, chưa có thời gian sử cho bạn được. Bạn thử dùng cái này nhé :

(defun C:pj (/ a b list1)

(defun *error* (msg)

(command "_.undo" "_E")

(princ "\nError: ") (princ msg) (princ " ")

(setq *error* olderr)

(princ)

)

(setq olderr *error*)

;;;(setq b (ssget '((0 . "LINE") (0 . "LWPOLYLINE") (0 . "ARC") )))

(setq b (ssget '((-4 . ""))))

(setq a (ssname b 0))

(setq list1 (assoc 0 (entget a)))

(cond

((null a) (princ "\nNone object selected"))

((= (cdr list1) "LWPOLYLINE")

(command "_.Pedit" a "j" b "" ""))

(progn (command "_.Pedit" a "" "j" b "" ""))

)

(setq *error* olderr)

(princ)

)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
cảm ơn bạn nhiều lắm. mình đã dùng thử nhưng mà lệnh này nó bắt mình phải chọn những 2 lần các đoạn thẳng cần nối, đầu tiên phải chọn sau đó đánh lệnh LJ sau đó lại chọn lại các đoạn cần nối, :undecided: liệu có cách nào chỉ cần đánh lệnh rồi chọn và enter là đuợc kô vậy bạn

Chào bạn nguyênkhoadung98,

Bạn nhầm rồi, đâu cần chọn đối tượng trước khi nhập lệnh lJ. Bạn chỉ cần load lisp, gõ lệnh LJ rồi chọn các đường cần nối. Sau khi nối xong một pline, lisp sẽ hỏi bạn có muốn nối tiếp nữa hay không? nếu bạn yes lisp sẽ yêu cầu bạn chọn tiếp đường nữa và các đoạn cần nối. Cứ thế cho đến khi bạn chán khống muốn nối nữa mà thôi.

Cái lisp này có ưu điểm là bạn theo dõi được suốt quá trình nối mà không sợ nhầm lẫn đường nọ với đường kia. Nhất là khi trên bản vẽ của bạn có tới vài trăm cái đường lít nhít đó bạn ạ.

Nếu bạn chỉ muốn nhập một lần thì như bài trước mình đã nói bạn rất dễ nhầm lẫn. Nếu bạn chấp nhận thì chỉ cần sử dụng cái lisp lần trước là Ok mà.

Chúc bạn vui.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bác phamthanhBinh

Việc đặt cố định điểm ghi Text cố định và chiều cao chữ cố định là hơi bị gò bó, chưa được theo ý muốn của người sử dụng. nên có thêm điểm đặt text và chiều cao chữ thì sẽ hợp ý với nguời sử dụng hơn.

 

Không phải góc dốc lớn hơn >pi/2 bạn sẽ thấy text bị lộn ngược đâu bác Bình ạ mà khi vẽ đường line từ phải qua trái (tức là điểm đầu nằm bên phải, điểm cuối nằm bên trái hay (Xdau>Xcuoi)

thì chắc chắn Text sẽ bị lộn ngược ở cả 2 trường hợp góc dốc >pi/2 và góc dốc nhỏ hơn pi/ 2

Như vậy bác phải bổ sung vào Lisp hàm if :

Nếu Xdau

Nếu Xdau > Xcuoi thì xử lý sao cho Text không bị lộn ngược

 

Bác xem điều đó có đúng không nhé?

 

Chào các bác Tue_nv, Tdvn, Sucuph.

Đây là cái lisp mình đã sửa theo ý bác Tue_nv.

Mọi người sử dụng thử và góp ý thêm nha.

(defun c:gocdoc ( / ent p1 cao_text sp ep ang dodoc thap_phan)
(vl-load-com)
(setq ent (entsel "\nChon mai doc:"))
(setq cao_text 0.5
thap_phan 2
p1 (cadr ent)
ent (car ent)
sp (vlax-curve-getStartPoint ent)
ep (vlax-curve-getEndPoint ent)
ang (angle sp ep)
dodoc (* (abs (/ (sin ang) (cos ang))) 100)
dodoc (strcat (rtos dodoc 2 thap_phan) "%"))
(if (	(command "_.text" (getpoint "\n Nhap diem dat text") (Getreal "\n Nhap  chieu cao text : ") (/ (* ang 180) pi)(strcat " Do doc mai la " dodoc))
(if (> (car sp) (car ep))
	(command "_.text" (getpoint "\n Nhap diem dat text") (Getreal "\n Nhap  chieu cao text : ") (+ 180 (/ (* ang 180) pi)) (strcat " Do doc mai la " dodoc))
	(command "_.text" (getpoint "\n Nhap diem dat text") (Getreal "\n Nhap  chieu cao text : ") 90 (strcat " Do doc mai la " dodoc))
)
)
)

Các bác lưu ý giùm trường hợp đường thẳng đứng Xđầu bằng Xcuối. Khi đó không rõ trong chuyên môn thì gọi đó là độ dốc gì? Hiện tại mình cứ để giá trị text là kết quả của biến dodoc, nhưng nó không nhất quán được do biến này dựa trên hàm tang là không xác định khi góc là bội lẻ của pi/2. Vậy nên nếu có thuật ngữ chuyên môn chỉ cái độ dốc oái oăm này thì các bác nhập béng nó vào trong nội dung text thể hiện là OK.

Ý mình như vậy, các bác cho thêm ý kiến nhé vì mình là dân cơ khí nên chịu mấy cái thuật ngữ chuyên ngành xây dựng cầu đường này.

Chúc các bác khỏe và vui.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào các bác Tue_nv, Tdvn, Sucuph.

Đây là cái lisp mình đã sửa theo ý bác Tue_nv.

Mọi người sử dụng thử và góp ý thêm nha.

(defun c:gocdoc ( / ent p1 cao_text sp ep ang dodoc thap_phan)
(vl-load-com)
(setq ent (entsel "\nChon mai doc:"))
(setq cao_text 0.5
thap_phan 2
p1 (cadr ent)
ent (car ent)
sp (vlax-curve-getStartPoint ent)
ep (vlax-curve-getEndPoint ent)
ang (angle sp ep)
dodoc (* (abs (/ (sin ang) (cos ang))) 100)
dodoc (strcat (rtos dodoc 2 thap_phan) "%"))
(if (	(command "_.text" (getpoint "\n Nhap diem dat text") (Getreal "\n Nhap  chieu cao text : ") (/ (* ang 180) pi)(strcat " Do doc mai la " dodoc))
(if (> (car sp) (car ep))
	(command "_.text" (getpoint "\n Nhap diem dat text") (Getreal "\n Nhap  chieu cao text : ") (+ 180 (/ (* ang 180) pi)) (strcat " Do doc mai la " dodoc))
	(command "_.text" (getpoint "\n Nhap diem dat text") (Getreal "\n Nhap  chieu cao text : ") 90 (strcat " Do doc mai la " dodoc))
)
)
)

Các bác lưu ý giùm trường hợp đường thẳng đứng Xđầu bằng Xcuối. Khi đó không rõ trong chuyên môn thì gọi đó là độ dốc gì? Hiện tại mình cứ để giá trị text là kết quả của biến dodoc, nhưng nó không nhất quán được do biến này dựa trên hàm tang là không xác định khi góc là bội lẻ của pi/2. Vậy nên nếu có thuật ngữ chuyên môn chỉ cái độ dốc oái oăm này thì các bác nhập béng nó vào trong nội dung text thể hiện là OK.

Ý mình như vậy, các bác cho thêm ý kiến nhé vì mình là dân cơ khí nên chịu mấy cái thuật ngữ chuyên ngành xây dựng cầu đường này.

Chúc các bác khỏe và vui.

Rất cảm ơn bác PhamThanhBinh và bác Tdvn.

Code trên chạy ngon lành.

Mình thấy hàm góc vẽ của bác Tdvn cực kì hay có thể xử lý cho Text quay đầu lên trên trong mọi trường hợp.

Nó làm cho Code trên trở nên gọn gàng hơn, khỏi cần lấy ra giá trị Xdau hay Xcuoi của Line gì hết chỉ cần kết hợp một hàm

(defun gocve( goc)

(if (and (> goc 90.0) (

)

và một dòng lệnh ghi Text tại điểm p, độ cao h, góc nghiêng g

(command "_.text" p h (gocve g) text)

Nó sẽ thay thế cho các dòng này :

(if (

(command "_.text" (getpoint "\n Nhap diem dat text") (Getreal "\n Nhap chieu cao text : ") (/ (* ang 180) pi)(strcat " Do doc mai la " dodoc))

(if (> (car sp) (car ep))

(command "_.text" (getpoint "\n Nhap diem dat text") (Getreal "\n Nhap chieu cao text : ") (+ 180 (/ (* ang 180) pi)) (strcat " Do doc mai la " dodoc))

(command "_.text" (getpoint "\n Nhap diem dat text") (Getreal "\n Nhap chieu cao text : ") 90 (strcat " Do doc mai la " dodoc))

)

)

Mình đã thử thay thế những dòng Code ở trên rồi, chạy tuyệt vời. Một lần nữa cám ơn bác Tdvn

Bác Bình thử chạy với hàm gocve nhé. Tuyệt lắm :undecided:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bạn nguyênkhoadung98,

Bạn nhầm rồi, đâu cần chọn đối tượng trước khi nhập lệnh lJ. Bạn chỉ cần load lisp, gõ lệnh LJ rồi chọn các đường cần nối. Sau khi nối xong một pline, lisp sẽ hỏi bạn có muốn nối tiếp nữa hay không? nếu bạn yes lisp sẽ yêu cầu bạn chọn tiếp đường nữa và các đoạn cần nối. Cứ thế cho đến khi bạn chán khống muốn nối nữa mà thôi.

Cái lisp này có ưu điểm là bạn theo dõi được suốt quá trình nối mà không sợ nhầm lẫn đường nọ với đường kia. Nhất là khi trên bản vẽ của bạn có tới vài trăm cái đường lít nhít đó bạn ạ.

Nếu bạn chỉ muốn nhập một lần thì như bài trước mình đã nói bạn rất dễ nhầm lẫn. Nếu bạn chấp nhận thì chỉ cần sử dụng cái lisp lần trước là Ok mà.

Chúc bạn vui.

Thành thật xin lỗi bạn tớ nhầm to rồi. lisp này của bạn là ok lắm rồi :undecided: , nhân tiện nhờ các bạn viết cho mình cái lisp để căn chỉnh text thẳng theo 1 đường ( cong hoac thang ) nào đó ( song song ) giống như là lệnh AL vậy. cụ thể như sau :

- đánh lệnh ( ao ( al va offset ) chẳng hạn )

- lisp sẽ hỏi text cần chỉnh và hỏi đuờng cần text song song theo

- hỏi khoảng cách offset giữa đường và text

- hết :cheers:

cảm ơn các bạn :cheers:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Thành thật xin lỗi bạn tớ nhầm to rồi. lisp này của bạn là ok lắm rồi :undecided: , nhân tiện nhờ các bạn viết cho mình cái lisp để căn chỉnh text thẳng theo 1 đường ( cong hoac thang ) nào đó ( song song ) giống như là lệnh AL vậy. cụ thể như sau :

- đánh lệnh ( ao ( al va offset ) chẳng hạn )

- lisp sẽ hỏi text cần chỉnh và hỏi đuờng cần text song song theo

- hỏi khoảng cách offset giữa đường và text

- hết :cheers:

cảm ơn các bạn :cheers:

Xin lỗi bạn nguyenkhoadung98, cho mình hỏi lại một chút.

Ý bạn căn text theo đường cong là thế nào nhỉ? Nghĩa là text cũng uốn cong đi hay là text vẫn thẳng nhưng song song với tiếp tuyến tại điểm chọn bạn nhỉ? Cái vụ text cong thì mình chưa làm được trong cád bao giờ. Trong Corel hay photoshop thì còn biết một chút. Nếu có thể bạn nói luôn cho mình biết cách bạn làm thằng text cong trong Cad nhé. Qua đó mới có thể hình dung ra cách dùng lisp được bạn ạ.

Bạn đừng giận vì cái sự chưa biết của mình.

Nếu có thể bạn hãy post bản vẽ cái ý tưởng của bạn lên nhé.

So ....or.....ry.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Xin lỗi bạn nguyenkhoadung98, cho mình hỏi lại một chút.

Ý bạn căn text theo đường cong là thế nào nhỉ? Nghĩa là text cũng uốn cong đi hay là text vẫn thẳng nhưng song song với tiếp tuyến tại điểm chọn bạn nhỉ? Cái vụ text cong thì mình chưa làm được trong cád bao giờ. Trong Corel hay photoshop thì còn biết một chút. Nếu có thể bạn nói luôn cho mình biết cách bạn làm thằng text cong trong Cad nhé. Qua đó mới có thể hình dung ra cách dùng lisp được bạn ạ.

Bạn đừng giận vì cái sự chưa biết của mình.

Nếu có thể bạn hãy post bản vẽ cái ý tưởng của bạn lên nhé.

So ....or.....ry.

cảm ơn bạn Binh đã quan tâm, mình chỉ cần nó song song với tiếp tuyến của đuờng cong tại điểm mình chọn thôi (các đuơng cong của mình nó chỉ hơi cong thôi gần như là thẳng vậy ). file up đây bạn ah.

 

http://www.cadviet.com/upfiles/untitled_116.jpg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Xin lỗi vì đã chen ngang, mình có vấn đề muốn hỏi một chút.

Hiện mình đang sử dụng Đánh cốt tự động bằng lisp DC của bạn Nguyen Hoang, nhưng mình gặp vấn đề như sau, trong bản vẽ mình hay dùng các tỷ lệ khác nhau (1/100, 1/50, 1/25...) nhưng mình chỉ dùng lisp này ở các mặt cắt có tỷ lệ trùng với của bản vẽ (giả sử là 1/100), ở các mặt cắt khác (giả như là 1/50, mình vẽ bằng cách scale 2) thì lisp này không dùng được nữa, các bạn có cách nào có câu hỏi xác định lỷ lệ trước được không? (mình gõ TYLE mà cad không hiểu lệnh này, set dym hiện hành khác cũng không được).

Mình nghĩ câu hỏi tỷ lệ này nên có giá trị mặc định để chỉ thay đổi khi cần thiết thôi, chứ mỗi lần dùng lại một lần xác định thì cũng hơi mất công. Hoặc sét tỷ lệ theo thông số của dim style hiện hành thì càng tốt.

Thz , hi vọng mọi người quan tâm vì mình hiện rất thích lisp này.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
cảm ơn bạn Binh đã quan tâm, mình chỉ cần nó song song với tiếp tuyến của đuờng cong tại điểm mình chọn thôi (các đuơng cong của mình nó chỉ hơi cong thôi gần như là thẳng vậy ). file up đây bạn ah.

 

http://www.cadviet.com/upfiles/untitled_116.jpg

Chào bạn nguyenkhoadung98,

Bạn dùng thử đoạn lisp này nhé. Nếu bạn thấy có gì chưa phù hợp hãy post lên để cùng trao đổi.

(defun C:AO ()
(setq text (entsel "\n Chon text can hieu chinh ")
  lst1 (entget (car text))
  p1 (cdr (assoc 10 lst1))
  ln (entsel "\n Chon duong chuan ")
  lst2 (entget (car ln))
  p2 (cadr ln)
  p3 (cdr (assoc 10 lst2))
  gc (angle p2 p3)
  h (getreal "\n Nhap khoang cach dat text : ")
)
;;; (setvar "pdmode" 3)
(if (= (cdr (assoc 0 lst2)) "LINE")
 (progn	  
 (if (and ( (* 1.5 pi) gc))
 (setq gc (+ pi gc))
 )
 (setq p4 (polar p2 (+ (/ pi 2) gc) h))
 (command "point" p4)
 (setq lst1 (subst (cons 10 p4) (assoc 10 lst1) lst1))
 (entmod lst1)
 (setq lst1 (subst (cons 50 gc) (assoc 50 lst1) lst1))
 (entmod lst1)
 (entupd (car text))
 )
)
(if (= (cdr (assoc 0 lst2)) "ARC")
(progn
(setq gc (+ pi gc))	
(setq p4 (polar p2 gc h))
(command "point" p4)
(if (and ( (* 2 pi) gc))
	(Progn		
	(setq lst1 (subst (cons 10 p4) (assoc 10 lst1) lst1))
	(entmod lst1)
	(setq lst1 (subst (cons 50 (+ gc (/ pi 2))) (assoc 50 lst1) lst1))
	(entmod lst1)
	(entupd (car text))
	)
	(Progn		
	(setq lst1 (subst (cons 10 p4) (assoc 10 lst1) lst1))
	(entmod lst1)
	(setq lst1 (subst (cons 50 (- gc (/ pi 2))) (assoc 50 lst1) lst1))
	(entmod lst1)
	(entupd (car text))
	)
)
)
)
)

Bạn lưu ý một số điểm về đoạn líp này như sau:

1/- Mình chưa viết phần check lại đối tượng chọn xem có đúng là text hay không nên khi lisp yêu cầu bạn chọn text thì bạn phải chọn đúng đối tượng là text, còn nếu bạn chọn đối tượng lá Mtext thì mã DXF của nó sẽ khác và kết quả lisp sẽ chạy sai.

2/- Mình mới viết phần chọn đường chuẩn là các line và các arc. Nếu bạn chọn đường chuẩn là các polyline, Mline, Lwpolyline thì lisp sẽ cho kết quả sai. Lẽ ra cần có việc kiểm tra xem đối tượng được chọn làm đường chuẩn có phải là line hay arc không nhưng mình lười chưa làm.

3/- Với đường chuẩn là cung tròn, mình luôn đặt text nằm bên ngoài cung (khoảng cách từ tâm cung tròn tới text lớn hơn bàn kính). Muốn nó nằm vào trong thì khi nhập khoảng cách bạn nhập một số âm.

4/- Với đường chuẩn là line, mình luôn đặt text nằm trên đường chuẩn. Muốn nó nằm dưới bạn cũng nhập khoảng cách là số âm.

5/- Lisp này cho bạn chỉnh mỗi lần một đối tượng text, nếu muốn chỉnh nhiều text thì cần cải tạo thêm một chút là được.

6/- Khi bạn chọn đường chuẩn cần lưu ý đặt điểm chọn trên đối tượng sao cho tương ứng với vị trí mà bạn muốn text vào. Cái này là do mình tiết kiệm thao tác khỏi phải chọn lại cái điểm đặt text sau khi chọn đường chuẩn thôi mà. Nếu bạn thấy không phù hợp thì mình sẽ sửa lại.

7/- Mình chỉ thay đổi điểm đặt và góc xoay của text nên các thuộc tính khác của nó vẫn giữ nguyên như nó vốn có. Do vậy cái thuộc tính Justify của text có thể làm cho bạn thấy text không song song với đường chuẩn cung tròn, nhất là khi chiều cao text lớn mà bán kính cung tròn lại nhỏ.

 

Với các đường chuẩn là polyline hay Spline thì việc lấy tiếp tuyến của nó phức tạp hơn khá nhiều do mã DXF của nó khá lôi thôi. Mình cũng đang thử nghiệm việc này nên chưa thể đưa vào cái lisp này được, mong bạn thông cảm.

 

Chúc bạn khỏe và vui.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Với các đường chuẩn là polyline hay Spline thì việc lấy tiếp tuyến của nó phức tạp hơn khá nhiều do mã DXF của nó khá lôi thôi. Mình cũng đang thử nghiệm việc này nên chưa thể đưa vào cái lisp này được, mong bạn thông cảm.

Về lệnh này mình nghỉ bạn nên cho chọn một điểm ngoài đường chuẩn (phía cần đặt text) để được điểm thứ nhất, sau đó dùng chế độ bắt điểm vuông góc với đường chuẩn bạn sẽ được điểm thứ 2. Text bạn cần thể hiện sẽ vuông góc với đoạn thẳng này (tất nhiên sẽ // với đường chuẩn) và cách đường chuẩn bao nhiêu là việc khá dễ dàng. Cách làm này bạn luôn tìm được hướng // với đường chuẩn cho dù nó là line, pline, spline ... khỏi phải tìm mã dxf. Vấn đề sẽ đơn giản hơn nhiều, không cần truy xuất csdl của đối tượng. Vài gợi ý cùng bạn.Chúc bạn thành công.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Về lệnh này mình nghỉ bạn nên cho chọn một điểm ngoài đường chuẩn (phía cần đặt text) để được điểm thứ nhất, sau đó dùng chế độ bắt điểm vuông góc với đường chuẩn bạn sẽ được điểm thứ 2. Text bạn cần thể hiện sẽ vuông góc với đoạn thẳng này (tất nhiên sẽ // với đường chuẩn) và cách đường chuẩn bao nhiêu là việc khá dễ dàng. Cách làm này bạn luôn tìm được hướng // với đường chuẩn cho dù nó là line, pline, spline ... khỏi phải tìm mã dxf. Vấn đề sẽ đơn giản hơn nhiều, không cần truy xuất csdl của đối tượng. Vài gợi ý cùng bạn.Chúc bạn thành công.

Chào bác tdvn,

Rất cám ơn sự gợi ý của bác, và đây là cái kết quả từ sự gợi ý này. Quả thật là với cách suy luận này thì hoàn toàn không phụ thuộc vào loại đường chuẩn và bài toán trở nên đơn giản hơn rất nhiều. Hy vọng rằng điều này sẽ đáp ứng được yêu cầu của bạn nguyenkhoadung98.

(defun C:ao ()
(setq Oldos (getvar "osmode"))
(setvar "osmode" 128)
(setq text (entsel "\n Chon text can hieu chinh ")
  lst1 (entget (car text))
  p1 (cdr (assoc 10 lst1))
  ln (entsel "\n Chon duong chuan ")

  p2 (getpoint "\n Chon diem phia dat text")
  p3 (getpoint p2 "\n Lay diem tren duong chuan")
  gc (angle p2 p3)
  h (getreal "\n Nhap khoang cach dat text : ")
)
;;;(setvar "pdmode" 3)
(setq p4 (polar p3 (+ pi gc) h))
(command "point" p4)
(if (and ( (* 2 pi) gc))
	(Progn		
	(setq lst1 (subst (cons 10 p4) (assoc 10 lst1) lst1))
	(entmod lst1)
	(setq lst1 (subst (cons 50 (+ gc (/ pi 2))) (assoc 50 lst1) lst1))
	(entmod lst1)
	(entupd (car text))
	)
	(Progn		
	(setq lst1 (subst (cons 10 p4) (assoc 10 lst1) lst1))
	(entmod lst1)
	(setq lst1 (subst (cons 50 (- gc (/ pi 2))) (assoc 50 lst1) lst1))
	(entmod lst1)
	(entupd (car text))
	)
)
(setvar "osmode" oldos)
)

 

@nguyenkhoadung98: Nếu bạn có nhu cầu hiệu chỉnh nhiều text trong một lần chạy lisp thì hãy post lên nhé, mình sẽ bổ sung. Lưu ý khi chọn điểm xác định phía đặt text cần phải chọn sao cho nó tương ứng với vị trí sẽ đặt text sau khi căn chỉnh.

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bác tdvn,

Rất cám ơn sự gợi ý của bác, và đây là cái kết quả từ sự gợi ý này. Quả thật là với cách suy luận này thì hoàn toàn không phụ thuộc vào loại đường chuẩn và bài toán trở nên đơn giản hơn rất nhiều. Hy vọng rằng điều này sẽ đáp ứng được yêu cầu của bạn nguyenkhoadung98.

(defun C:ao ()
(setq Oldos (getvar "osmode"))
(setvar "osmode" 128)
(setq text (entsel "\n Chon text can hieu chinh ")
  lst1 (entget (car text))
  p1 (cdr (assoc 10 lst1))
  ln (entsel "\n Chon duong chuan ")

  p2 (getpoint "\n Chon diem phia dat text")
  p3 (getpoint p2 "\n Lay diem tren duong chuan")
  gc (angle p2 p3)
  h (getreal "\n Nhap khoang cach dat text : ")
)
;;;(setvar "pdmode" 3)
(setq p4 (polar p3 (+ pi gc) h))
(command "point" p4)
(if (and (< pi gc) (> (* 2 pi) gc))
	(Progn		
	(setq lst1 (subst (cons 10 p4) (assoc 10 lst1) lst1))
	(entmod lst1)
	(setq lst1 (subst (cons 50 (+ gc (/ pi 2))) (assoc 50 lst1) lst1))
	(entmod lst1)
	(entupd (car text))
	)
	(Progn		
	(setq lst1 (subst (cons 10 p4) (assoc 10 lst1) lst1))
	(entmod lst1)
	(setq lst1 (subst (cons 50 (- gc (/ pi 2))) (assoc 50 lst1) lst1))
	(entmod lst1)
	(entupd (car text))
	)
)
(setvar "osmode" oldos)
)

 

@nguyenkhoadung98: Nếu bạn có nhu cầu hiệu chỉnh nhiều text trong một lần chạy lisp thì hãy post lên nhé, mình sẽ bổ sung. Lưu ý khi chọn điểm xác định phía đặt text cần phải chọn sao cho nó tương ứng với vị trí sẽ đặt text sau khi căn chỉnh.

 

hì cảm ơn bạn nhiều lắm, mình đã dùng thử và dùng rất tốt bạn ah, nhưng nó có 1 vấn đề như sau :

- sau khi thực hiện xong lệnh thì nó xuất hiện thêm 1 điểm bên cạnh text ( hic cái này rất là kô mong muốn )

và hi vọng bạn cải tiến nó sao cho nó có thể dùng đuợc cho nhiều text cug lúc :undecided:. cảm ơn bạn nhiều lắm.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
hì cảm ơn bạn nhiều lắm, mình đã dùng thử và dùng rất tốt bạn ah, nhưng nó có 1 vấn đề như sau :

- sau khi thực hiện xong lệnh thì nó xuất hiện thêm 1 điểm bên cạnh text ( hic cái này rất là kô mong muốn )

và hi vọng bạn cải tiến nó sao cho nó có thể dùng đuợc cho nhiều text cug lúc :undecided:. cảm ơn bạn nhiều lắm.

Chào bạn nguyenkhoadung98,

Cái điểm xuất hiện là do đoạn code (command "point" p4) mà ra. Mình viết đoạn code này cho mục tiêu kiểm tra lại điểm đặt của text cò đúng với khoảng cách nhập vào hay không. Nếu bạn không cần thì chỉ việc xóa đoạn code này đi hoặc vô hiệu hóa nó bằng các dấu ;;;; phía trước hàm. Ngoài ra bạn cũng có thể không hiển thị cái điểm này bằng cách đặt biến hệ thống pdmode về giá trị 1. (setvar "pdmode" 1)

Việc cải tiến để có thể chỉnh nhiều text trong một lần chạy mình sẽ làm và gửi bạn. Ráng chờ chút xíu.

Chúc bạn vui.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
hì cảm ơn bạn nhiều lắm, mình đã dùng thử và dùng rất tốt bạn ah, nhưng nó có 1 vấn đề như sau :

- sau khi thực hiện xong lệnh thì nó xuất hiện thêm 1 điểm bên cạnh text ( hic cái này rất là kô mong muốn )

và hi vọng bạn cải tiến nó sao cho nó có thể dùng đuợc cho nhiều text cug lúc :undecided:. cảm ơn bạn nhiều lắm.

Chào bạn nguyenkhoadung98,

Lisp này mình đã sửa lại theo ý bạn. Bạn dùng thử nhé và hy vọng sẽ OK.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Check (/ans);;; Kiem tra dieu kien lap
(if (= ans "y")
(main text)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun main (text /)
(setq Oldos (getvar "osmode"))
(setvar "osmode" 128)
(setq text (entsel "\n Chon text can hieu chinh ")
  lst1 (entget (car text))
  p1 (cdr (assoc 10 lst1))
  ln (entsel "\n Chon duong chuan ")

  p2 (getpoint "\n Chon diem phia dat text")
  p3 (getpoint p2 "\n Lay diem tren duong chuan")
  gc (angle p2 p3)
  h (getreal "\n Nhap khoang cach dat text : ")
)
;;;(setvar "pdmode" 3)
(setq p4 (polar p3 (+ pi gc) h))
;;;;(command "point" p4)
(if (and ( (* 2 pi) gc))
	(Progn		
	(setq lst1 (subst (cons 10 p4) (assoc 10 lst1) lst1))
	(entmod lst1)
	(setq lst1 (subst (cons 50 (+ gc (/ pi 2))) (assoc 50 lst1) lst1))
	(entmod lst1)
	(entupd (car text))
	)
	(Progn		
	(setq lst1 (subst (cons 10 p4) (assoc 10 lst1) lst1))
	(entmod lst1)
	(setq lst1 (subst (cons 50 (- gc (/ pi 2))) (assoc 50 lst1) lst1))
	(entmod lst1)
	(entupd (car text))
	)
)
(setq sl (1+ sl))
(setvar "osmode" oldos)
(setq ans (getstring "\n Tiep tuc? [y or n] : "))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun C:ao (/ text ans sl oldos lst1 p1 p2 p3 p4 ln gc h)
(setq sl 0)
(main text)
(while (= ans "y")
(check ans)
)
(alert (strcat "Ban da chinh lai vi tri cua " (itoa sl) " text"))
(princ)
)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bạn nguyenkhoadung98,

Lisp này mình đã sửa lại theo ý bạn. Bạn dùng thử nhé và hy vọng sẽ OK.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Check (/ans);;; Kiem tra dieu kien lap
(if (= ans "y")
(main text)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun main (text /)
(setq Oldos (getvar "osmode"))
(setvar "osmode" 128)
(setq text (entsel "\n Chon text can hieu chinh ")
  lst1 (entget (car text))
  p1 (cdr (assoc 10 lst1))
  ln (entsel "\n Chon duong chuan ")

  p2 (getpoint "\n Chon diem phia dat text")
  p3 (getpoint p2 "\n Lay diem tren duong chuan")
  gc (angle p2 p3)
  h (getreal "\n Nhap khoang cach dat text : ")
)
;;;(setvar "pdmode" 3)
(setq p4 (polar p3 (+ pi gc) h))
;;;;(command "point" p4)
(if (and (< pi gc) (> (* 2 pi) gc))
	(Progn		
	(setq lst1 (subst (cons 10 p4) (assoc 10 lst1) lst1))
	(entmod lst1)
	(setq lst1 (subst (cons 50 (+ gc (/ pi 2))) (assoc 50 lst1) lst1))
	(entmod lst1)
	(entupd (car text))
	)
	(Progn		
	(setq lst1 (subst (cons 10 p4) (assoc 10 lst1) lst1))
	(entmod lst1)
	(setq lst1 (subst (cons 50 (- gc (/ pi 2))) (assoc 50 lst1) lst1))
	(entmod lst1)
	(entupd (car text))
	)
)
(setq sl (1+ sl))
(setvar "osmode" oldos)
(setq ans (getstring "\n Tiep tuc? [y or n] : "))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun C:ao (/ text ans sl oldos lst1 p1 p2 p3 p4 ln gc h)
(setq sl 0)
(main text)
(while (= ans "y")
(check ans)
)
(alert (strcat "Ban da chinh lai vi tri cua " (itoa sl) " text"))
(princ)
)

cảm ơn bạn Binh rất nhiều, cho mình xin thêm 1 chút điều chỉnh nhé. bạn có thể đặt chế độ multi để lần sau mình chỉ cần chọn text, điểm đặt text và điểm trên đường chuẩn thôi đc kô còn chiều dài và đuờng cong thì vẫn thế ( vậy cho nhanh vì mình chỉ chỉnh trên 1 đuờng và khoảng cách đặt text là như nhau hết bạn ah :undecided: ), nếu đòi hỏi quá đáng mong bạn bỏ wa

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
cảm ơn bạn Binh rất nhiều, cho mình xin thêm 1 chút điều chỉnh nhé. bạn có thể đặt chế độ multi để lần sau mình chỉ cần chọn text, điểm đặt text và điểm trên đường chuẩn thôi đc kô còn chiều dài và đuờng cong thì vẫn thế ( vậy cho nhanh vì mình chỉ chỉnh trên 1 đuờng và khoảng cách đặt text là như nhau hết bạn ah :cheers: ), nếu đòi hỏi quá đáng mong bạn bỏ wa

hic thêm nữa là sau khi thực hiện lệnh nó tự động bỏ hết snap của mình chỉ cho chọn mỗi cái perpendicular ( vuông góc ) thôi :undecided:(

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình cần viết một đoạn để người dùng nhập dữ liệu vào. nếu lười, thì enter chấp nhận giá trị mặc định. nếu nhập vào, giá trị ấy sẽ mặc định cho lần sau. Nhưng viết xong, đọc lại thấy lòng vòng như dở hơi. Bạn nào sửa hộ hoặc cho một đoạn khác với.

(if (= UDRL nil)(setq UDRL 1000)(setq UDRL UDR))

(setq UDR (getint (strcat "\nUNIT DRAW ? <" (rtos UDRL 2 0) "> :")))

(if (= UDR nil)(setq UDR UDRL))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
...trong bản vẽ mình hay dùng các tỷ lệ khác nhau (1/100, 1/50, 1/25...) nhưng mình chỉ dùng lisp này ở các mặt cắt có tỷ lệ trùng với của bản vẽ (giả sử là 1/100), ở các mặt cắt khác (giả như là 1/50, mình vẽ bằng cách scale 2) thì lisp này không dùng được nữa, các bạn có cách nào có câu hỏi xác định lỷ lệ trước được không?

Mình viết thế này, bạn xem thử. Mình lấy tên là FRA (viết tắt của frame) tức là vẽ luôn một cái khung, tạo mõt kiểu text, một kiểu dim, thiết lập tỉ lệ cho net khuất.vvv, khi cần loại tỉ lệ nào, bạn phang tỉ lệ ấy. mình viết lâu rồi, và để dễ chỉnh sửa, mìng cứ để nguyên con theo hàng, không gộp lại, nên không ngắn và đẹp mắt lắm...nhưng kệ thôi, hì

;-----------

(defun c:FRA ()

(setvar "EXPERT" 5)

(if (= nil (tblsearch "layer" "defpoints"))

(command "layer" "n" "defpoints" "c" "251" "defpoints" "")

)

(if (= nil (tblsearch "layer" "center"))

(command "layer" "n" "CENTER" "C" "251" "CENTER" "L" "CENTER" "CENTER" "LW" "0.09" "CENTER" "")

)

(command "layer" "C" "252" "0" "LW" "0.18" "0" "")

(smod)

(if (= PLAL nil)(setq PLAL 3)(setq PLAL PLA))

(setq PLA (getint (strcat "\nPAGE A? <" (rtos PLAL 2 0) "> :")))

(if (= PLA nil)(setq PLA PLAL))

(cond

((= PLA 0)(setq XPT 1154.94 YPT 830.92))

((= PLA 1)(setq XPT 830.92 YPT 559.99))

((= PLA 2)(setq XPT 583.95 YPT 386.0))

((= PLA 3) (setq XPT (* 1.41 283.91) YPT (* 1.41 196.91)))

((= PLA 4) (setq XPT 283.91 YPT 196.91))

)

;-------------------------------------------------------------------------------

;TAO BLOCK $UDR THAM CHIEU DON VI VE

 

(setq e (tblsearch "block" "$UDR"))

(if (= nil e)

(progn

(if (= UDRL nil)(setq UDRL 1000)(setq UDRL UDR))

(setq UDR (getint (strcat "\nUNIT DRAW ? <" (rtos UDRL 2 0) "> :")))

(if (= UDR nil)(setq UDR UDRL))

 

(entmake '((0 . "block")(2 . "$UDR")(70 . 64)(10 0 0 0)))

(entmake (list '(0 . "LINE")(cons 39 UDR) '(10 0 0 0) '(11 1000 0 0)))

(entmake '((0 . "endblk")))

(setvar "ltscale" (* 0.22 UDR))

)

(progn

(setq e (tblsearch "block" "$UDR"))

(setq UDR (cdr (assoc 39 (entget(cdr(assoc -2 e))))))

(setvar "ltscale" (* 0.22 UDR))

; (setvar "celtscale" (* 0.004 (* 0.22 UDR (/ SCD 100))))

)

)

;-------------------------------------------------------------------------------

;TAO BLOCK $DFAL DIMFAL

 

(setq e (tblsearch "block" "$DFAL"))

(if (= nil e)

(progn

(setq DFAL (/ 1000.0 UDR))

(if (= 1 UDR)(setq DFAL 1.0 DDEC 1)(setq DDEC 0))

(entmake '((0 . "block")(2 . "$DFAL")(70 . 64)(10 0 0 0)))

(entmake (list '(0 . "LINE")(cons 39 DFAL) '(10 0 0 0) '(11 1000 0 0)))

(entmake '((0 . "endblk")))

)

(progn

(setq e (tblsearch "block" "$DFAL"))

(setq DFAL (cdr (assoc 39 (entget(cdr(assoc -2 e))))))

)

)

;-------------------------------------------------------------------------------

(if (= SCDL nil)(setq SCDL "100")(setq SCDL SCDT))

(setq SCDT (getstring (strcat "\nSCALE DRAW 100,200,500... <" SCDL "> :")))

(if (= SCDT "")(setq SCDT SCDL))

(setq SCD (atof SCDT))

;-------------------------------------------------------------------------------

;tao textstyle

 

(setq TST (rtos SCD 2 0))

(setq TS (* 0.22 UDR (/ SCD 100))) ;tao textsize

(setvar "textsize" TS)

(FR1)

(setq DSC (* TS 0.5))

(FR2)

(setq e (tblsearch "style" TST))

(if (/= nil e)

(progn

(setvar "textstyle" TST)

(command "dimstyle" "r" TST)

)

)

;-------------------------------------------------------------------------------

 

;TAO KHUNG BAN VE

 

(SETVAR "OSMODE" 0)

(setq XPT (* 0.001 SCD UDR XPT) YPT (* 0.001 SCD UDR YPT))

(setq P0 (getpoint "\nBASE FRAM OR ENTER :"))

(if (/= nil p0)

(progn

(setq PC (list (+ (car P0) XPT) (+ (cadr P0) YPT)))

(command "rectangle" P0 PC)

(setq e0 (entlast))

(command "chprop" e0 "" "la" "defpoints" "")

(command "text" "j" "TL" P0 "0" (strcat "IN A" (rtos PLA 2 0) " ,TL : 1/" SCDT))

(setq e0 (entlast))

(command "chprop" e0 "" "layer" "defpoints" "")

(command "rectangle"

(list (+ (* 5 TS) (car P0)) (+ (* 0.5 TS) (cadr P0)))

(list (- (car PC) (* 0.5 TS)) (- (cadr PC) (* 0.5 TS)))

)

(setq e0 (entlast))

(command "chprop" e0 "" "c" "1" "lw" "0.4" "")

 

(setq TS (* 0.22 UDR (/ SCD 100))) ;tao textsize

 

)

(progn

(setq P0 (list 0 0 0))

(if (> 500 (distance (getvar "vsmin")(getvar "vsmax")))

(progn

(setq PC (list (+ (car P0) XPT) (+ (cadr P0) YPT)))

(command "rectangle" P0 PC)

(setq e0 (entlast))

(command "chprop" e0 "" "la" "defpoints" "")

(command

"zoom" P0 (list (+ (car P0) XPT) (+ (cadr P0) YPT))

"zoom" "0.9x"

)

(command "text" "j" "TL" P0 "0" (strcat "IN A" (rtos PLA 2 0) " ,TL : 1/" SCDT))

(setq e0 (entlast))

(command "chprop" e0 "" "layer" "defpoints" "")

(command "rectangle"

(list (+ (* 5 TS) (car P0)) (+ (* 0.5 TS) (cadr P0)))

(list (- (car PC) (* 0.5 TS)) (- (cadr PC) (* 0.5 TS)))

)

(setq e0 (entlast))

(command "chprop" e0 "" "c" "1" "lw" "0.4" "")

(setq TS (* 0.22 UDR (/ SCD 100))) ;tao textsize

)

)

)

)

;-------------------------------------------------------------------------------

;TAO KIEU NET DUT VA NET GACH

 

(setvar "ltscale" (* 0.22 UDR))

(setvar "celtscale" (* 0.004 (* 0.22 UDR (/ SCD 100))))

 

 

(rmod)

(princ "\n")

(princ)

)

;---------------------------------------------------------------------

(defun FR1 ()

(setq e (entget(tblobjname "style" (getvar "textstyle"))))

(setq e (subst (cons 2 TST) (assoc 2 e) e))

(setq e (subst (cons 40 TS)(assoc 40 e) e))

(setq e (subst (cons 41 0.7)(assoc 41 e) e))

; (setq e (subst (cons 3 "VAVOB.TTF") (assoc 3 e) e))

(setq e (subst (cons 3 "VAVOB__0.TTF") (assoc 3 e) e))

; (setq e (subst (cons 3 "ARIAL.TTF") (assoc 3 e) e))

(entmake e)

(setvar "textstyle" TST)

)

(defun FR2 ()

(if (= nil (tblobjname "block" "dimled"))

(progn

(entmake '((0 . "block")(2 . "dimled")(70 . 64)(10 70 0 0)));diem chen 70

(entmake '((0 . "polyline")))

(entmake '((0 . "vertex")(40 . 0)(41 . 0)(10 120 0 0)));bat dau tu 120

(entmake '((0 . "vertex")(10 0 0 0))) ;ve 0

(entmake '((0 . "vertex")(40 . 300)(41 . 0)(10 0 0 0)));mo do rong 300 tu 0

(entmake '((0 . "vertex")(10 70 0 0))) ;dai mui ten den 70 do rong 0

(entmake '((0 . "seqend")))

(entmake '((0 . "endblk")))

)

)

(if (= nil (tblobjname "block" "dim"))

(progn

(entmake '((0 . "block")(2 . "dim")(70 . 64)(10 0 0 0)))

(entmake '((0 . "polyline")))

(entmake '((0 . "vertex")(40 . 70)(41 . 70)(10 -60 -60 0)))

(entmake '((0 . "vertex")(10 60 60 0)))

(entmake '((0 . "seqend")))

(entmake '((0 . "endblk")))

)

)

(command

"dim" "setvar"

"dimsah" 1

"dim" "setvar"

"dimsoxd" 0

"dim" "setvar"

"dimblk1" "dim"

"dim" "setvar"

"dimblk2" "dim"

"dim" "setvar"

"dimldrblk" "dimled"

"dim" "setvar"

"dimasz" 2

"dim" "setvar"

"dimdli" 5

"dim" "setvar"

"dimexe" 1.25

"dim" "setvar"

"dimexo" 0

"dim" "setvar"

"dimasz" 0.01

"dim" "setvar"

"dimcen" 2.5

"dim" "setvar"

"dimtad" 1

"dim" "setvar"

"dimjust" 0

"dim" "setvar"

"dimgap" 1

"dim" "setvar"

"dimtix" 1

"dim" "setvar"

"dimtxt" 0.18

"dim" "setvar"

"dimtmove" 2

"dim" "setvar"

"dimupt" 0

"dim" "setvar"

"dimtofl" 1

"dim" "setvar"

"dimtih" 0

"dim" "setvar"

"dimrnd" 0

"dim" "setvar"

"dimtxsty" TST

"dim" "setvar"

"dimscale" DSC

"dim" "setvar"

"dimdec" DDEC

"dim" "setvar"

"dimlfac" DFAL

"save" TST "e"

)

)

 

;----------

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình cần viết một đoạn để người dùng nhập dữ liệu vào. nếu lười, thì enter chấp nhận giá trị mặc định. nếu nhập vào, giá trị ấy sẽ mặc định cho lần sau. Nhưng viết xong, đọc lại thấy lòng vòng như dở hơi. Bạn nào sửa hộ hoặc cho một đoạn khác với.

(if (= UDRL nil)(setq UDRL 1000)(setq UDRL UDR))

(setq UDR (getint (strcat "\nUNIT DRAW ? <" (rtos UDRL 2 0) "> :")))

(if (= UDR nil)(setq UDR UDRL))

Một ví dụ:

(if (not UDR0) (setq UDR0 1000))
(setq UDR (getint (strcat "\nUNIT DRAW <" (itoa UDR0) "> :")))
(if (not UDR) (setq UDR UDR0) (setq UDR0 UDR))

 

Bạn tham khảo thêm các lisp đã post trên diễn đàn sẽ thấy có một số thủ thuật khác nữa.

Good luck!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
cảm ơn bạn Binh rất nhiều, cho mình xin thêm 1 chút điều chỉnh nhé. bạn có thể đặt chế độ multi để lần sau mình chỉ cần chọn text, điểm đặt text và điểm trên đường chuẩn thôi đc kô còn chiều dài và đuờng cong thì vẫn thế ( vậy cho nhanh vì mình chỉ chỉnh trên 1 đuờng và khoảng cách đặt text là như nhau hết bạn ah :undecided: ), nếu đòi hỏi quá đáng mong bạn bỏ wa

Chào bạn nguyenkhoa dung98,

Yêu cầu của bạn không khó khăn gì, bạn có thể tự sửa đoạn lisp trên như sau:

1/- Cut dòng lisp: ln (entsel "\n Chon duong chuan ") trong main lisp Paste vào dưới dòng (setq sl 0) trong lisp AO. Trêm vào trước ln các ký tự (setq và cuối dòng ký tự ) thành dòng lisp hoàn chỉnh sau: (setq ln (entsel "\n Chon duong chuan "))

2/- Cut dòng lisp: h (getreal "\n Nhap khoang cach dat text : ") trong main lisp paste vào dưới dòng lisp trên và cũng thêm cácký tự như trên để thành dòng lisp hoàn chỉnh: (setq h (getreal "\n Nhap khoang cach dat text : "))

3/- Bạn hãy kiểm tra lại chế độ osnap của bạn trước khi chạy lisp nhé vì lisp đã trả biến hệ thống "osmode" về giá trị oldos ban đầu của bản vẽ rồi mà. Có thể là do bạn đã đặt giá trị biến này là 128 từ trước lúc chạy lisp rồi nên sau khi chạy nó mới chỉ còn một chế độ truy bắt perpencular bạn ạ.

 

Rất mong bạn đạt được mong muốn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×