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

Viết lisp theo yêu cầu [phần 2]

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

Cảm ơn bác gia_bach. như vậy là đủ rồi. Điều em muốn ở đây không phải là thống kê tên chủ trên BĐĐC mà là đoạn code tự động lấy Text theo Layer để gán vào biến từ đó xử lý biến này theo ý mình.

 

Cảm ơn TRUNGNGAMY đã quan tâm. Đúng là trên BDDC không có số điện thoại hay gì gì đó, còn BDDC thì mình hiểu rõ vì mình làm BDDC chính quy bạn ah. Trên thực tế chẳng có ai đi thống kê tên chủ như trên bởi vì BDDC được thành lập bằng Microstation + Famis, khi Export sang AutoCAD không tương thích Font nên các chữ không sử dụng được. Hơn nữa đã có sổ địa chính, sổ mục kê ... thống kê đầy đủ rồi.

Mình kg hiểu ý bạn. Nếu bạn đã có file BĐĐC hoàn chỉnh trên Famis và các file dữ liệu kèm theo thì việc của bạn có vẻ thừa. Nếu trên Famis bạn đã đọc đc tiếng Việt thì khi chuyển sang cad, bạn chỉ cần đổi font là đc rồi. Còn cái danh sách số thửa, tên chủ, địa chỉ, bạn có thể sử dụng trực tiếp file của BĐĐC hoặc nếu cần xử lý thì cũng xử lý trên các file này

  • 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
Mình kg hiểu ý bạn. Nếu bạn đã có file BĐĐC hoàn chỉnh trên Famis và các file dữ liệu kèm theo thì việc của bạn có vẻ thừa. Nếu trên Famis bạn đã đọc đc tiếng Việt thì khi chuyển sang cad, bạn chỉ cần đổi font là đc rồi. Còn cái danh sách số thửa, tên chủ, địa chỉ, bạn có thể sử dụng trực tiếp file của BĐĐC hoặc nếu cần xử lý thì cũng xử lý trên các file này

Ý mình ở đây không phải là viết cái lisp để làm trên BDDC mà là đọan Code tự động lấy các text trên 1 Layer nào đó gán vào biến để xử lý. Cái File mình Up lên chỉ là ví dụ để dễ hình dung thôi

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 ở đây không phải là viết cái lisp để làm trên BDDC mà là đọan Code tự động lấy các text trên 1 Layer nào đó gán vào biến để xử lý. Cái File mình Up lên chỉ là ví dụ để dễ hình dung thôi

Chào bác moihoclisp,

Mình không hiểu rõ lắm ý của bạn, nhưng nếu chỉ là việc lấy tập hợp các text trên một layer thì bạn có thể sử dụng hàm ssget với tham số "x" và các filter list là ok mà.

Ví dụ:

(setq tenlayer (gestring "\n Hay nhap ten layer chua text"))

(setq ss (ssget "x" (list ( 0. "TEXT") (cons 8 tenlayer))))

 

Như vậy bạn sẽ có tập ss bao gồm tất cả các text trên layer có tên mà bạn đã chọn. Từ đó để lấy riêng mỗi text ra bạn có thể sử dụng các vòng lặp foreach hay while hay if tùy ý bạn và tha hồ chặt chém nó.

 

Bạn hãy thử xem có đúng với cái ý của bạn không nhé.

Xin lỗi bạn nếu mình hiểu chưa đúng cái bạn cầ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
Đúng rồi Thaistreets!

Mình thiết kết trắc ngang nhưng khi xuất qua cad rồi mà có một số thay đổi nên cao độ thiết kế tại một số điểm trên mặt cắt bị sai. Nhưng cao độ thiết kế tại tim đường (của mỗi mặt cắt) thì vẫn đúng. Nên mình muốn dựa vào cao độ thiết kế tại tim đường của mỗi mặt cắt để tình lại cao độ tại các điểm bị sai.

Cảm ơn Thaistreets đã giúp đỡ!

Chiều nay em bận quá, giờ mới post lên cho bác được.

Lisp của bác đây ạ:

- Pick điểm tim trắc ngang -> Pick chọn text cao độ tương ứng của tim

- Pick các điểm cần lấy cao độ thiết kế -> Pick chọn text để ghi cao độ điểm đó. -> tiếp tục pick các điểm khác... Enter để kết thúc.

(defun DXF (code elist)  (cdr (assoc code elist)))
(prompt"\n[cmd : CTN] - GHI CAO DO TRAC NGANG\n")
(defun c:ctn ()
(command "Undo" "BEGIN")
(setq CMLAST (getvar "cmdecho"))
(setq OSLAST (getvar "OSMODE"))
(setq DZ (getvar "DIMZIN"))
(setq OT (getvar "ORTHOMODE"))
(setvar "ORTHOMODE" 0)
(setvar "cmdecho" 0)
(command "osmode" 1)
(setq pt0 (osnap (getpoint "Diem tim TN tu nhien") "end")) (print)
(setq y0 (cadr pt0))
(setq ed (entget (car (entsel "\nChon text cao do tim: "))))
(setq H0 (read (DXF 1 ed)))    
(command "osmode" 4335)
(setq pt (getpoint "\nDiem tra cao do: "))
(While (/= pt nil)
(setq y (- (cadr pt) y0 (- H0)) out 0)
(while (= out 0)
(setq res (entsel "\n Chon text ghi cao do"))
(if res
(progn
(setvar "dimzin" 0)
(entmod (subst (cons 1 (rtos y 2 2)) (assoc 1 (entget (car res))) (entget (car res))))
(setq out 1)
);progn
);if
);while
(setvar "DIMZIN" DZ)
(command "osmode" 4335)
(setq pt (getpoint "\nDiem chen: "))
);while 
(setvar "OSMODE" OSLAST)
(setvar "ORTHOMODE" OT)
(setvar "cmdecho" CMLAST)
(prompt"\n[GHI CAO DO TREN TRAC NGANG] by Thaistreetz - huuthais@yahoo.com\n")
(command "Undo" "End")
(princ)
);end
;---------------------------------------------------------------

  • 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
Chào bác moihoclisp,

Mình không hiểu rõ lắm ý của bạn, nhưng nếu chỉ là việc lấy tập hợp các text trên một layer thì bạn có thể sử dụng hàm ssget với tham số "x" và các filter list là ok mà.

Ví dụ:

(setq tenlayer (gestring "\n Hay nhap ten layer chua text"))

(setq ss (ssget "x" (list ( 0. "TEXT") (cons 8 tenlayer))))

 

Như vậy bạn sẽ có tập ss bao gồm tất cả các text trên layer có tên mà bạn đã chọn. Từ đó để lấy riêng mỗi text ra bạn có thể sử dụng các vòng lặp foreach hay while hay if tùy ý bạn và tha hồ chặt chém nó.

 

Bạn hãy thử xem có đúng với cái ý của bạn không nhé.

Xin lỗi bạn nếu mình hiểu chưa đúng cái bạn cần.

Đúng ý em rồi bác ah. nhưng em viết y như vậy mà chạy thử không được

(defun c:gan (/ hoten diachi sdthoai)

(setq hoten(ssget "X"(list (cons 0 "Text")(cons 8 "tchu"))))

(setq diachi(ssget "X"(list(cons 0 "Text")(cons 8 "dchi"))))

(setq sdthoai(ssget "X"(list(cons 0 "Text")(cons 8 "dthoai"))))

(princ hoten ); in thử trên dòng command xem có được không

)

Trên bản vẽ đã có các text thuộc các layer trên. (giả sử mỗi Layer chỉ có 1 text)

Bác xem thử dùm em nhé. Bác thông cảm kiến thức lisp của em đúng như tên em vậ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
Đúng ý em rồi bác ah. nhưng em viết y như vậy mà chạy thử không được

(defun c:gan (/ hoten diachi sdthoai)

(setq hoten(ssget "X"(list (cons 0 "Text")(cons 8 "tchu"))))

(setq diachi(ssget "X"(list(cons 0 "Text")(cons 8 "dchi"))))

(setq sdthoai(ssget "X"(list(cons 0 "Text")(cons 8 "dthoai"))))

(princ hoten ); in thử trên dòng command xem có được không

)

Trên bản vẽ đã có các text thuộc các layer trên. (giả sử mỗi Layer chỉ có 1 text)

Bác xem thử dùm em nhé. Bác thông cảm kiến thức lisp của em đúng như tên em vậy.

Ngay từ đầu bạn đưa đoạn code này lên có phải nhanh hơn kg. Chẳng qua bạn viết sai cú pháp thôi

(defun c:gan( / hoten diachi sdthoai)

(setq hoten (ssget "X" (list (cons 0 "Text") (cons 8 "tchu"))))

(setq diachi (ssget "X" (list (cons 0 "Text") (cons 8 "dchi"))))

(setq sdthoai (ssget "X" (list (cons 0 "Text") (cons 8 "dthoai"))))

(princ hoten); in thử trên dòng command xem có được không

)

 

Câu lệnh (princ hoten) kg cho bạn thấy text mà chỉ thấy một tập hợp chọ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
Chiều nay em bận quá, giờ mới post lên cho bác được.

Lisp của bác đây ạ:

- Pick điểm tim trắc ngang -> Pick chọn text cao độ tương ứng của tim

- Pick các điểm cần lấy cao độ thiết kế -> Pick chọn text để ghi cao độ điểm đó. -> tiếp tục pick các điểm khác... Enter để kết thúc.

(defun DXF (code elist)  (cdr (assoc code elist)))
(prompt"\n[cmd : CTN] - GHI CAO DO TRAC NGANG\n")
(defun c:ctn ()
(command "Undo" "BEGIN")
(setq CMLAST (getvar "cmdecho"))
(setq OSLAST (getvar "OSMODE"))
(setq DZ (getvar "DIMZIN"))
(setq OT (getvar "ORTHOMODE"))
(setvar "ORTHOMODE" 0)
(setvar "cmdecho" 0)
(command "osmode" 1)
(setq pt0 (osnap (getpoint "Diem tim TN tu nhien") "end")) (print)
(setq y0 (cadr pt0))
(setq ed (entget (car (entsel "\nChon text cao do tim: "))))
(setq H0 (read (DXF 1 ed)))    
(command "osmode" 4335)
(setq pt (getpoint "\nDiem tra cao do: "))
(While (/= pt nil)
(setq y (- (cadr pt) y0 (- H0)) out 0)
(while (= out 0)
(setq res (entsel "\n Chon text ghi cao do"))
(if res
(progn
(setvar "dimzin" 0)
(entmod (subst (cons 1 (rtos y 2 2)) (assoc 1 (entget (car res))) (entget (car res))))
(setq out 1)
);progn
);if
);while
(setvar "DIMZIN" DZ)
(command "osmode" 4335)
(setq pt (getpoint "\nDiem chen: "))
);while 
(setvar "OSMODE" OSLAST)
(setvar "ORTHOMODE" OT)
(setvar "cmdecho" CMLAST)
(prompt"\n[GHI CAO DO TREN TRAC NGANG] by Thaistreetz - huuthais@yahoo.com\n")
(command "Undo" "End")
(princ)
);end
;---------------------------------------------------------------

Cảm ơn Thaistreets! Đúng cái mình cần rồi, Lisp tốt 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

có thể chỉnh phím esc thành phím "chuột phải" được ko ? mình ít khi dùng chuột phải.mà ko muốn với tay lên phím esc (lười). giúp mình với hay.thank truớc

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,

Vừa rồi có tìm thấy 1 cái ứng dụng, của lệnh ATTI

http://www.cadviet.com/upfiles/2/sannen.rar

http://www.cadviet.com/upfiles/2/control.rar (phải apload cả 2 file mới dùng được)

 

Vì là file VLX, trong đó lại có rất nhiều ứng dụng, e dùng cái phần mềm để biến thành file lisp, chỉ để tách 1 ứng dụng lệnh ATT thôi

http://www.cadviet.com/upfiles/2/1_2.rar

http://www.cadviet.com/upfiles/2/2.rar

Khổ nỗi, chỉnh sửa mãi mà không được vừa ý

đây là file sau khi biên dịch, nhờ các bác sửa dùm để có lệnh ATTI như file gốc

Trân thành cảm ơn!

Các bác ơi, giúp em với!

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
Đúng ý em rồi bác ah. nhưng em viết y như vậy mà chạy thử không được

(defun c:gan (/ hoten diachi sdthoai)

(setq hoten(ssget "X"(list (cons 0 "Text")(cons 8 "tchu"))))

(setq diachi(ssget "X"(list(cons 0 "Text")(cons 8 "dchi"))))

(setq sdthoai(ssget "X"(list(cons 0 "Text")(cons 8 "dthoai"))))

(princ hoten ); in thử trên dòng command xem có được không

)

Trên bản vẽ đã có các text thuộc các layer trên. (giả sử mỗi Layer chỉ có 1 text)

Bác xem thử dùm em nhé. Bác thông cảm kiến thức lisp của em đúng như tên em vậy.

Chào bạn moihoclisp,

Vì bạn mới học lisp nên bạn nên chú ý về cú pháp của các hàm lisp ngay từ đầu và các mã DXF của đối tượng bạn nhé.

1/- Bất cứ hàm lisp nào thì giữa các tên hàm, đối số , tham số và các biến đều phải có một khoảng trắng bạn ạ. Bạn đừng làm liền tù tì như trên mà có khi lisp nó chả phân biệt được bạn định bảo nó làm gì bạn nhé.

2/- Với mã DXF là 0 thì nó chỉ tên loại đối tượng trên bản vẽ và tên này luôn luôn là một chuỗi text in hoa.

Với mã DXF là 8 thì nó chỉ tên lớp chứa đối tượng và tên lớp có thể là chữ hoa hay chữ thường tùy ý bạn nhưng phải đúng với tên đã dùng trên bản vẽ.

 

Do vậy các hàm trên của bạn nên viết lại như sau:

(defun c:gan (/ hoten diachi sdthoai)

(setq hoten (ssget "X" (list (cons 0 "TEXT") (cons 8 "tchu"))))

(setq diachi (ssget "X" (list (cons 0 "TEXT") (cons 8 "dchi"))))

(setq sdthoai (ssget "X" (list (cons 0 "TEXT") (cons 8 "dthoai"))))

(princ hoten ); in thử trên dòng command tên tập chọn trong acad của biến hoten

)

 

Nếu bạn muốn in ra nội dung các text trong tập chọn này bạn có thể thêm vào phía trước dấu ngoặc kết thúc hàm defun như sau:

(setq i 0

a (sslength hoten))

(while (

(setq ent (ssname hoten i)

txt (cdr (assoc 1 (entget ent))))

(princ (strcat "" txt ""))

(setq i (1+ i))

)

 

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

các bác cho em xin một lisp đơn giản hơn dùng cho việc điền kích thước vào nhiều tuyến cống trên một mặt bằng

1> lisp có tác dụng : điền một text song song với đường pl ( spl và line nữa càng tốt ) tại đúng điểm kích vào đường pl đó ( giáp tuyến với đường pl ), chiều của text theo chiều đường pl, cách đường pl một khoảng nhỏ

2> lisp điền một BLOCK song song với đường pl tại đúng điểm kích chọn đường pl đó ( giáp tuyến với đường pl ), block có thể được định nghĩa từ trước, block sau khi điền cách đường pl một khoảng được định nghĩa từ trước

em đang phải vẽ rất nhiều loại này, dùng các lệnh copy và rote, ed text rất mất thời gian, các bác giúp em với

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 anh chị trên Diễn đàn! Chúc mọi người có một trung thu ấm áp bên gia đình và người thân!

Hôm nay em muốn nhờ các anh, chị viết giùm em 2 lisp như sau:

 

1. Em cần 1 lisp giống với lisp anh Tue_NV và Thaistreetz đã viết giúp em ở Bài viết số 2636 và 2637 ở topic này .

Nhưng khác như sau:

+ Nhập lệnh.

+ Nhập tiền tố, hoặc hâu tố. Ví dụ: P.

+ Nhập số bắt đầu (từ bàn phím), ví dụ số 9.

+ Nhập khoảng cách (độ tăng, giảm), ví dụ 1.

+ Dùng chuột pick vào 1 điểm bất kỳ, ở điểm đó sẽ xuất hiện text P.9.

+ Màn hình hỏi nhập góc quay của text, có thể lựa chọn góc quay bằng chuột.

+ Pick vào điểm thứ 2, điểm đó xuất hiện text P.10, pick vào điểm thứ 3, ở điểm đó xuất hiện text P.11 ...

 

2. Em muốn xin 1 lisp thống kê text. Cụ thể như sau:

+ Nhập lệnh.

+ Chọn vị trí lập bảng thống kê.

+ Chọn các text cần sắp xếp. (các text này có nội dung bất kỳ, góc quay bất kỳ và thuộc các layer bất kỳ).

+ Sau khi enter (hoặc space), các text sẽ được copy ra một vị trí khác, sắp xếp thành hàng ngang (song song với Ox).

+ Tiếp tục enter, quay lại lệnh, chọn các text cần sắp xếp, các text cũng được copy và sắp xếp vào vị trí ngay dưới hàng text phía trên.

...

Rất cảm ơn và mong được giúp đỡ!

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
................................

2. Em muốn xin 1 lisp thống kê text. Cụ thể như sau:

+ Nhập lệnh.

+ Chọn vị trí lập bảng thống kê.

+ Chọn các text cần sắp xếp. (các text này có nội dung bất kỳ, góc quay bất kỳ và thuộc các layer bất kỳ).

+ Sau khi enter (hoặc space), các text sẽ được copy ra một vị trí khác, sắp xếp thành hàng ngang (song song với Ox).

+ Tiếp tục enter, quay lại lệnh, chọn các text cần sắp xếp, các text cũng được copy và sắp xếp vào vị trí ngay dưới hàng text phía trên.

...

Rất cảm ơn và mong được giúp đỡ!

Bạn nói rõ qui luật sắp xếp các text thành hàng ngang:

- thứ tự sắp xếp Text ? các Text cách đều nhau 1 khoảng bằng hằng số ?

- các Text nối với nhau thành 1 Text ?

Bạn chạy thử Lisp này :

(defun c:sapxep (/ dsach pt pt1 ss ten txtsiz)
 (setq pt (getpoint "\nDiem dat Bang thong ke Text:"  )
txtsiz (* (getvar "dimtxt")(getvar "dimscale")) )
 (princ "\nChon Text can sap xep :")
 (while (setq ss (ssget (list (cons 0 "Text"))))
   (setq dsach (list) pt1 pt)
   (foreach e (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
     (setq ten (cdr (assoc 1 e))
    dsach (append (list ten) dsach) )
     )
   (foreach ten dsach
     (Make_Text_bl pt1 ten txtsiz)
     (setq pt1 (polar pt1 0 (* 10 txtsiz)))
     )
   (setq pt (polar pt (/ pi -2) (* 1.5 txtsiz)))
   (princ "\nChon Text can sap xep :")    
   )
 (princ)
)

(defun Make_Text_bl(pt val TextSize)
 (entmake (list '(0 . "TEXT")
                (cons 10 pt)
                (cons 40 TextSize)
                (cons 1 val)
                (cons 7 (getvar "TEXTSTYLE"))
                '(71 . 0)
                '(72 . 0)
                '(73 . 1)
                (cons 11 pt))))

  • 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
Bạn nói rõ qui luật sắp xếp các text thành hàng ngang:

- thứ tự sắp xếp Text ? các Text cách đều nhau 1 khoảng bằng hằng số ?

- các Text nối với nhau thành 1 Text ?

Rất cảm ơn anh gia_bach!

Lisp của anh đã gần đúng với mong muốn của em. Chỉ còn một điểm, nhờ anh sửa hộ như sau:

Lisp của anh sắp xếp text được chọn theo chiều từ phải sang trái, nhưng em muốn text được sắp xếp theo chiều từ trái sang phải.

Thêm nữa: các text không cần nối với nhau thành 1 text.

 

Có lẽ để anh và mọi người hiểu rõ hơn vì sao em cần lisp này, em xin mô tả như sau:

Em cần thống kê tên nút, tên ống, chiều dài - đường kính ống và cao độ tại nút trong một sơ đồ mạng lưới để nhập số liệu vào Excel và Epanet. (Chiều dài ống em đã đo bằng chính lisp Dinfo.lsp của anh gia_bach).

Vì các ống và các text sắp xếp không theo trật tự nào nên nếu em cứ zoom đi zoom lại bản vẽ để xem text và chép vào giấy thì sẽ lâu hơn nếu có một lisp giúp em sắp xếp chúng thành hàng trước khi chép vào giấy.

Đây là file mô tả:

http://www.cadviet.com/upfiles/2/mat_bang_cap_nuock_1.dwg

Cảm ơn anh đã giúp đỡ!

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
......

1. Em cần 1 lisp giống với lisp anh Tue_NV và Thaistreetz đã viết giúp em ở Bài viết số 2636 và 2637 ở topic này .

Nhưng khác như sau:

+ Nhập lệnh.

+ Nhập tiền tố, hoặc hâu tố. Ví dụ: P.

+ Nhập số bắt đầu (từ bàn phím), ví dụ số 9.

+ Nhập khoảng cách (độ tăng, giảm), ví dụ 1.

+ Dùng chuột pick vào 1 điểm bất kỳ, ở điểm đó sẽ xuất hiện text P.9.

+ Màn hình hỏi nhập góc quay của text, có thể lựa chọn góc quay bằng chuột.

+ Pick vào điểm thứ 2, điểm đó xuất hiện text P.10, pick vào điểm thứ 3, ở điểm đó xuất hiện text P.11 ...

....

Em dùng Lisp này thử xem nhé :

(defun c:nhaplenh(/ oldim ans tto hto so ang delta tp so cao p)
(setq oldim (getvar "Dimzin"))
(setvar "Dimzin" 0)
(initget "T H")
(setq ans (getkword "\n Nhap tien to hoac hau to  :"))
(if (= ans "T") 
  (progn
   (if (not ttoo) (setq ttoo " "))
   (setq tto (getstring (strcat "\n Nhap tien to  :")))
   (if (not tto) (setq tto ttoo) (setq ttoo tto))
  )
)

(if (= ans "H") 
  (progn
   (if (not htoo) (setq htoo " "))
   (setq hto (getstring (strcat "\n Nhap hau to  :")))
   (if (not hto) (setq hto htoo) (setq htoo hto))
  )
)

(if (not soo) (setq soo 1))
(setq so (getreal (strcat "\n Nhap so bat dau  :")))
(if (not so) (setq so soo) (setq soo so))


(if (not deltao) (setq deltao 1))
(setq delta (getreal (strcat "\gia so  :")))
(if (not delta) (setq delta deltao) (setq deltao delta))

(if (not tpo) (setq tpo 0))
(setq tp (getint (strcat "\n So chu so thap phan  :")))
(if (not tp) (setq tp tpo) (setq tpo tp))
(setq cao (getdist "\n Chon chieu cao Text :"))

(if (= ans "T")
(progn
(while (setq p (getpoint "\n Chon diem dat Text :"))
(if (not ango) (setq ango 0))
(setq ang (getangle (strcat "\n Chon goc quay cua Text  :")))
(if (not ang) (setq ang ango) (setq ango ang))
(wtxt (strcat tto (rtos so 2 tp)) p ang cao)
(setq so (+ so delta))
);while
);progn

(progn
(while (setq p (getpoint "\n Chon diem dat Text :"))

(if (not ango) (setq ango 0))
(setq ang (getangle (strcat "\n Chon goc quay cua Text  :")))
(if (not ang) (setq ang ango) (setq ango ang))

(wtxt (strcat (rtos so 2 tp) hto) p ang cao)
(setq so (+ so delta))
);while
);progn
);if

(setvar "Dimzin" oldim)
(princ)
)
;
(defun wtxt (txt p ang h / sty)
(setq sty (getvar "textstyle"))
(entmake (list (cons 0 "TEXT") (cons 7 sty) 
(cons 1 txt) (cons 10 p) (cons 11 p) 
(cons 72 0) (cons 73 1) (cons 50 ang) 
(cons 40 h) (cons 41 1))
)
)

Đường Link mà svba gửi ở bài viết số 242 bị lỗi không down load được. Em xem lại đường Link nhé

  • 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

Cảm ơn anh Tue_NV!

Anh xem lại lisp trên giùm em, vì em đã thử appload lisp ở cả 2 máy khác nhau. Sau khi gõ NHAPLENH rồi Enter, không thấy xuất hiện gì cả, kể cả "Unknown command NHAPLENH" như nhiều lúc em vẫn thấy.

Em đã sửa lại đường link ở bài viết số 242. (Em nhận thấy lỗi là do em sử dụng trợ giúp bbcode).

Nhờ anh và mọi người xem giúp!

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,

Vừa rồi có tìm thấy 1 cái ứng dụng, của lệnh ATTI

http://www.cadviet.com/upfiles/2/sannen.rar

http://www.cadviet.com/upfiles/2/control.rar (phải apload cả 2 file mới dùng được)

 

Vì là file VLX, trong đó lại có rất nhiều ứng dụng, e dùng cái phần mềm để biến thành file lisp, chỉ để tách 1 ứng dụng lệnh ATT thôi

http://www.cadviet.com/upfiles/2/1_2.rar

http://www.cadviet.com/upfiles/2/2.rar

Khổ nỗi, chỉnh sửa mãi mà không được vừa ý

đây là file sau khi biên dịch, nhờ các bác sửa dùm để có lệnh ATTI như file gốc

Trân thành cảm ơ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
Cảm ơn anh Tue_NV!

Anh xem lại lisp trên giùm em, vì em đã thử appload lisp ở cả 2 máy khác nhau. Sau khi gõ NHAPLENH rồi Enter, không thấy xuất hiện gì cả, kể cả "Unknown command NHAPLENH" như nhiều lúc em vẫn thấy.

Em đã sửa lại đường link ở bài viết số 242. (Em nhận thấy lỗi là do em sử dụng trợ giúp bbcode).

Nhờ anh và mọi người xem giúp!

Không hiểu tại sao em load không được.

Đây là Lisp gốc. Hãy chạy lại thử nhé :

http://www.cadviet.com/upfiles/2/nhaplenh.lsp

Còn file ở bài viết số 242 của svba thì Tue_NV có xem qua nhưng vẫn chưa hiểu được ý của svba

 

Có lẽ Svba nên nói rõ hơn ngay ở trong file, mô tả càng chi tiết càng tốt điều mà em muốn Lisp thực hiện.

Input -> process -> Output

Chú ý lưu file dưới dạng CAD2000 nhé

Chúc vui vẻ

  • 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
Lisp của anh đã gần đúng với mong muốn của em. Chỉ còn một điểm, nhờ anh sửa hộ như sau:

....... em muốn text được sắp xếp theo chiều từ trái sang phải.

Chào svba1608

Đã cập nhật theo yêu cầu, bạn check lại nhé.

(defun c:sapxep (/ lst pt pt1 ss ten txtsiz)
 (defun dxf (tag obj) (cdr (assoc tag obj)))
 (setq pt (getpoint "\nDiem dat Bang thong ke Text:"  )
txtsiz (* (getvar "dimtxt")(getvar "dimscale")) )
 (princ "\nChon Text can sap xep :")
 (while (setq ss (ssget (list (cons 0 "Text"))))
   (setq pt1 pt)
   (setq lst (vl-sort (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
		 '(lambda (x y) (if (equal (car(setq x1 (dxf 10 x))) (car(setq y1 (dxf 10 y))))
				      (> (cadr x1) (cadr y1))
				      (< (car x1) (car y1))
				      ))))
   (foreach e lst
     (setq ten (dxf 1 e))
     (Make_Text_bl pt1 ten txtsiz)
     (setq pt1 (polar pt1 0 (* 10 txtsiz)))
     )
   (setq pt (polar pt (/ pi -2) (* 2.0 txtsiz)))
   (princ "\nChon Text can sap xep :")    
   )
 (princ)
)

(defun Make_Text_bl(pt val TextSize)
 (entmake (list '(0 . "TEXT")
                (cons 10 pt)
                (cons 40 TextSize)
                (cons 1 val)
                (cons 7 (getvar "TEXTSTYLE"))
                '(71 . 0)
                '(72 . 0)
                '(73 . 1)
                (cons 11 pt))))

  • 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

Cảm ơn anh Tue_NV! Lần này thì em đã sử dụng được lisp trên rồi.

Đây là file bản vẽ em đã cố gắng nói rõ ý mình qua 3 bước: Input, Process và Output, và đã save sang định dạng Cad 2000.

Nhờ anh và mọi người xem giùm!

http://www.cadviet.com/upfiles/2/mat_bang_cap_nuock_2.dwg

Chào svba1608

Đã cập nhật theo yêu cầu, bạn check lại nhé.

Rất cảm ơn anh gia_bach!

Anh gia_bach có thể xem giúp em về lisp của anh ở đây không?

 

Nhân tiện, em nhờ các anh viết thêm giùm em 1 lisp được mô tả trong bảng màu xanh ở file đính kèm phía trên. Với điều kiện là vòng tròn ở dạng wipeout.

Em xin cảm ơ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
Cảm ơn anh Tue_NV! Lần này thì em đã sử dụng được lisp trên rồi.

Đây là file bản vẽ em đã cố gắng nói rõ ý mình qua 3 bước: Input, Process và Output, và đã save sang định dạng Cad 2000.

http://www.cadviet.com/upfiles/2/dienbien.dwg

....

Svba hãy sử dụng đoạn Code sau :

(defun c:sapxep(/ oldos ans pt nutdau cdnutdau chieudai cao pt2 cdai dkinh pt3 Nutcuoi cdNutcuoi)
(setvar "cmdecho" 0)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ans "C")
(setq pt (getpoint "\nDiem dat Bang thong ke Text:"  ))

(while pt
(if (setq Nutdau (entsel "\n Pick vao Nut dau  :"))
(progn
   (setq cao (cdr(assoc 40 (entget (car nutdau)) ))) 
   (wtxt (cdr(assoc 1 (entget (car nutdau)) )) pt cao)
   (command "MATCHPROP" (car nutdau) (entlast) "")
   (entmod (subst (cons 50 0) (assoc 50 (entget(entlast))) (entget(entlast)) ))
)
)

(if (setq cdNutdau (entsel "\n Pick vao cao do Nut dau  :"))
 (progn
   (setq cao (cdr(assoc 40 (entget (car cdnutdau)) ))) 
   (setq pt2 (list (+ (car pt) (* 8 cao)) (cadr pt) (caddr pt))) 
   (wtxt (cdr(assoc 1 (entget (car cdnutdau)) )) pt2 cao)
   (command "MATCHPROP" (car cdnutdau) (entlast) "")
   (entmod (subst (cons 50 0) (assoc 50 (entget(entlast))) (entget(entlast)) ))
 )
)

(if (setq chieudai (entsel "\n Pick vao chieu dai va duong kinh :"))
 (progn
   (setq cao (cdr(assoc 40 (entget (car chieudai)) )))
   (setq pt2 (list (+ (car pt) (* 20 cao)) (cadr pt) (caddr pt))) 
   (wtxt (cdr(assoc 1 (entget (car chieudai)) )) pt2 cao)
   (command "MATCHPROP" (car chieudai) (entlast) "")
   (entmod (subst (cons 50 0) (assoc 50 (entget(entlast))) (entget(entlast)) ))
   (setq cdai (substr (cdr(assoc 1 (entget (car chieudai)) )) 2 3))
   (entmod (subst (cons 1 cdai) (assoc 1 (entget(entlast))) (entget(entlast)) ))
   (setq pt3 (list (+ (car pt) (* 26 cao)) (cadr pt) (caddr pt))) 
   (setq dkinh (substr (cdr(assoc 1 (entget (car chieudai)) )) 7 9))
   (command "copy" (entlast) "" pt2 pt3)
   (entmod (subst (cons 1 dkinh) (assoc 1 (entget(entlast))) (entget(entlast)) ))
 )
)

(if (setq Nutcuoi (entsel "\n Pick vao Nut cuoi  :"))
 (progn
   (setq cao (cdr(assoc 40 (entget (car nutcuoi)) ))) 
   (setq pt2 (list (+ (car pt) (* 22 cao)) (cadr pt) (caddr pt)))
   (wtxt (cdr(assoc 1 (entget (car nutcuoi)) )) pt2 cao)
   (command "MATCHPROP" (car nutcuoi) (entlast) "")
   (entmod (subst (cons 50 0) (assoc 50 (entget(entlast))) (entget(entlast)) ))
 )
)

(if (setq cdNutcuoi (entsel "\n Pick vao cao do Nut cuoi  :"))
  (progn
   (setq cao (cdr(assoc 40 (entget (car cdnutcuoi)) ))) 
   (setq pt2 (list (+ (car pt) (* 34 cao)) (cadr pt) (caddr pt)))
   (wtxt (cdr(assoc 1 (entget (car cdnutcuoi)) )) pt2 cao)
   (command "MATCHPROP" (car cdnutcuoi) (entlast) "")
   (entmod (subst (cons 50 0) (assoc 50 (entget(entlast))) (entget(entlast)) ))
  )
)
(initget "C K")
(setq ans (getkword "\n Ban muon thong ke tiep hay khong  ?"))
(if (= ans "C") 
  (setq pt (list (car pt) (- (cadr pt) (* 4 cao)) (caddr pt)))
  (setq pt nil)
);if

);while
(setvar "osmode" oldos)
(princ)
)
;
(defun wtxt (txt p h / sty)
(setq sty (getvar "textstyle"))
(entmake (list (cons 0 "TEXT") (cons 7 sty) 
(cons 1 txt) (cons 10 p) (cons 11 p) 
(cons 72 0) (cons 73 1) 
(cons 40 h) (cons 41 1))
)
)

:cheers:

  • 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

Mình đang cần 1 lisp để quay viewport, mô tả như sau:

 

Có 1 file bình đồ, chuyển sang chế độ layout, muốn viewport quay 1 góc mà góc đó được tạo bởi 1 line mình chọn trong layout và trục Ox.

 

(Nếu làm thủ công thì sẽ phải vẽ 1 đường ngang, rồi đo góc của 1 line trong layout với đường ngang này, sau đó quay viewport 1 góc như vậy để biến đường xiên thành đường ngang bằng lệnh DV tw .... )

 

Cái này hình như có lệnh nhưng nghe nói chỉ dùng với cad2008 trở lên, còn mình đang xài cad2007

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
Đây là phần tiếp theo của topic Viết lisp theo yêu cầu, mời các bạn tiếp tục thảo luận.

Lâu lắm mới lên lại diễn đàn CAD việt, Chúc diễn đàn ngày càng phát triển.

Thank bác Hoành, bác SSG, bác Tuệ và ... Đã huớng dẫn nhiệt tình và giúp đỡ cho những aem mới vào nghề...

Như là 1 sự giúp đỡ khỏi đầu mới... hjhj

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ái lệnh ATTI có chức năng đánh số thứ tự các block thuộc tính ATTDEF

1- Ban đầu nó bắt chọn 1 block đại diện cho tất cả các block đó:

"Pick mot block de nhan dang:"

atti111.jpg

2- Sau đó ta chọn 1 đối tượng trong thuộc tính: Ví dụ: "SO" hoặc " DIEN TICH" hoac khoi lượng "KHOILUONG". Em sẽ trọn "so"

3- Và chọn 1 miền chứa các block cùng thuộc tính

att222.jpg

=> kết quả: nó sẽ đánh số thứ tự tăng dần từ trái qua phải hoặc ngươc lại Trên đơn vị là "SO" mà ta đã chọn của các block

Đây là file cad của nó! http://www.cadviet.com/upfiles/2/san_nen.dwg

....................

Chào MANHHUNGXDA

Gửi bạn Lisp có chức năng đánh số thứ tự các block thuộc tính ATTDEF theo yêu cầu. Link download

Nhớ chép file ATTI.dcl vào Support File Search Path.

  • Vote tăng 2

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.

×