Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Nguyen Hoanh

Viết Lisp theo yêu cầu

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

namng    0

Bac Hoang viet dum toi cai lisp co noi dung sau nha, Tui viet mai khong dc

Noi dung lisp:

1. Chon 1 pline

2. Nhap mot muc cao do chuan

3. Ve duong dong tai cac dinh pline den duong nam ngang co cao do chuan vua nhap ( ve mat cat ngang y ma)

Bac giup em voi nha

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
Nguyen Hoanh    4.524
Bac Hoang viet dum toi cai lisp co noi dung sau nha, Tui viet mai khong dc

Noi dung lisp:

1. Chon 1 pline

2. Nhap mot muc cao do chuan

3. Ve duong dong tai cac dinh pline den duong nam ngang co cao do chuan vua nhap ( ve mat cat ngang y ma)

Bac giup em voi nha

 

lệnh DONG dưới đây sẽ làm điều bạn muốn:

(defun c:dong ( / ent py)
 (setq	ent (car (entsel "\nChon 1 pline:"))
py  (cadr (trans (getpoint "\nNhap mot muc cao do chuan: ") 1 0))
 )
 (mapcar '(lambda (x)(if (= (car x) 10) (entmake (list (cons 0 "line") x (list 11 (cadr x) py)))))(entget ent))
 (princ)
)

  • 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
namng    0

Cam on bac Nguyen Hoanh. Bac co the giai thich ro ho em cai cau lenh nay khong

*****

(mapcar '(lambda (x)(if (= (car x) 10) (entmake (list (cons 0 "line") x (list 11 (cadr x) py)))))(entget ent))

*****

Em doc mai ma van khong hieu trinh tu the nao.

Bac giup em voi nha.

Thank.

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
duongsatdn    762
Gõ "trim" enter

select đối tượng để chọn dao cắt xong

gõ "f", rồi pick 2 điểm để cắt hàng loạt

Xong.

Với CAD2008 không cần gõ thêm "f", chỉ cần chọn nhiều đối tượng theo kiểu cửa sổ.

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
crazylisp    14
Cam on bac Nguyen Hoanh. Bac co the giai thich ro ho em cai cau lenh nay khong

*****

(mapcar '(lambda (x)(if (= (car x) 10) (entmake (list (cons 0 "line") x (list 11 (cadr x) py)))))(entget ent))

*****

Em doc mai ma van khong hieu trinh tu the nao.

Bac giup em voi nha.

Thank.

Bạn mới học lisp đừng đú theo bác Hoành, kẻo tẩu hoả nhập ma.

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
namng    0

Mình cũng biết một ít về Lisp mà. Đang định dùng cái Lisp của bác Hoanh để viết tiếp cái tính khoảng cách giữa các đỉnh của pline theo phương ngang và phương đứng. Nhưng mà đọc mãi cái dòng lệnh đó mà không hiểu. Bác Hoanh hay bác nao đó giúp tôi 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
ssg    1.088
Mình cũng biết một ít về Lisp mà. Đang định dùng cái Lisp của bác Hoanh để viết tiếp cái tính khoảng cách giữa các đỉnh của pline theo phương ngang và phương đứng. Nhưng mà đọc mãi cái dòng lệnh đó mà không hiểu. Bác Hoanh hay bác nao đó giúp tôi với.

Xin phép anh Hoành, ssg thêm mấy dòng giải thích cho bạn namng:

1) Biểu thức (entget ent) lấy data của pline

2) Trong đám data đó, cái nào có car bằng 10 là các đỉnh pline. Hàm if lọc bỏ những cái không thoả điều kiện này.

3) (list 11 (cadr x) py) là điểm có cùng hoành độ với điểm đang xét, tung độ là py

4) Entmake tạo 1 line tương ứng với 2 điểm vừa đề cập

5) Lambda là hàm khuyết danh, với argument x.

6) Mapcar thực hiện lambda lần lượt cho tất cả các thành phần của data. Kết hợp với if, nó chỉ thực hiện với các thành phần chứa toạ độ các đỉnh của pline.

Nếu bạn chưa thoả mãn với các giải thích trên thì có lẽ crazylisp có lý! Bạn nên "luyện công" với các kỹ thuật đơn giản hơn.

Ví dụ như cái này, hy vọng là bạn hiểu được:

(defun C:DONG2( / ent data py x p)
(setq
ent (car (entsel "\nChon 1 pline:"))
data (entget ent)
py (cadr (trans (getpoint "\nNhap mot muc cao do chuan: ") 1 0))
)
(foreach x data
  (if (= (car x) 10) (progn
   (setq p (list (cadr x) py))
   (entmake (list (cons 0 "line") x (cons 11 p)))
))
)
)

 

Cung cách hoạt động của 2 chương trình trên giống y chang nhau, chỉ khác ở cách viết. Bạn hiểu DONG2 thì có thể hiểu được DONG của anh Hoà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
tienlagiay_dxt    185

Mình có 1 loạt block attribute, mình muốn thống kê tọa độ các tại các điểm chèn của nhũng block att kia

Có ai có lisp giúp mình thực hiện được cong việc kia ko, tọa độ của các điểm chèn các block at kia dc ghi ra dưới dang x==, y== thì càng tốt

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
Nguyen Hoanh    4.524
Mình có 1 loạt block attribute, mình muốn thống kê tọa độ các tại các điểm chèn của nhũng block att kia

Có ai có lisp giúp mình thực hiện được cong việc kia ko, tọa độ của các điểm chèn các block at kia dc ghi ra dưới dang x==, y== thì càng tốt

bạn có thể upload file dwg lên được không, trong file dwg có block attribute của 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
tienlagiay_dxt    185
bạn có thể upload file dwg lên được không, trong file dwg có block attribute của bạn?

Đây là file bản vẽ của mình, mình có các ranh mốc ct là các block att, mình muốn có tọa độ của các ranh mốc đó(chính là tọa độ) của các điểm chèn

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

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
Nguyen Hoanh    4.524
Đây là file bản vẽ của mình, mình có các ranh mốc ct là các block att, mình muốn có tọa độ của các ranh mốc đó(chính là tọa độ) của các điểm chèn

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

Bạn hãy post 1 file có một vài mốc đã được đánh toạ độ.

Tôi không biết ghi toạ độ vào đâu trong block của 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
tienlagiay_dxt    185
Bạn hãy post 1 file có một vài mốc đã được đánh toạ độ.

Tôi không biết ghi toạ độ vào đâu trong block của bạn.

cho phép tôi gọi bác hoành cho thân thiện nhé

Bác có thể chỉ e cách làm ko

Nếu có thể thì xuất tọa dộ sangễclla2 hay nhất

Hoặc xuất tọa độ sangben6 cạnh cũng được

Em chỉ cần tọa độ để lập bảng thống kê thối mà

Công việc loại này e làm nhiều, nên nếu có lisp thì rất tiện dụng

Bác giúp em 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
Nguyen Hoanh    4.524
cho phép tôi gọi bác hoành cho thân thiện nhé

Bác có thể chỉ e cách làm ko

Nếu có thể thì xuất tọa dộ sangễclla2 hay nhất

Hoặc xuất tọa độ sangben6 cạnh cũng được

Em chỉ cần tọa độ để lập bảng thống kê thối mà

Công việc loại này e làm nhiều, nên nếu có lisp thì rất tiện dụng

Bác giúp em nhé

Bạn cần export dữ liệu ra file riêng?

hay là ghi dữ liệu vào màn hình CAD?

 

Bạn hãy upload file mẫu lên, thể hiện đủ 2 trạng thái. 1 trạng thái là trước khi dùng lisp, 1 trạng thái là sau khi dùng lisp.

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
tienlagiay_dxt    185
Bạn cần export dữ liệu ra file riêng?

hay là ghi dữ liệu vào màn hình CAD?

 

Bạn hãy upload file mẫu lên, thể hiện đủ 2 trạng thái. 1 trạng thái là trước khi dùng lisp, 1 trạng thái là sau khi dùng lisp.

Đây là file mẫu http://www.cadviet.com/upfiles/vidu.rar

Thực tế công việc mình chỉ cần là 1 bảng thống kê tọa độ bên cad như file mẫu

Nếu lisp xuất được dữ kiệu sang file excel thì tốt nhất,mình sẽ dán ngược trở lại ffile cad , khi viết thuyết minh, mình sẽ sử dụng luôn được dữ liệu 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
dotranduy    0

Em đang làm san nền. Em muốn xin 1 cái lips tính khối lượng. Chẳng hạn khi em tính với ô lưới 10 hoặc 20 thì khi em gõ lệnh nó sẽ hỏi chỉ ô đất cần tính, sau đó chọn các số H đào đắp. Rùi nó tự chia trung bình và nhân với diện tích ô đất. Sau đó chọn điểm đặt vòng tròn khối lượng ( trong đó có Số thứ tự ô, Diện tích ô đất, H đắp trung bình , và khối lượng đất. Em đã tìm mấy cái lips trong này nhưng lỗi ko dùng được) Bác nào làm ơn viết hộ em 1 cái lips kiểu như thế được ko ạ? Em cám ơn trướ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
Nguyen Hoanh    4.524
Đây là file mẫu http://www.cadviet.com/upfiles/vidu.rar

Thực tế công việc mình chỉ cần là 1 bảng thống kê tọa độ bên cad như file mẫu

Nếu lisp xuất được dữ kiệu sang file excel thì tốt nhất,mình sẽ dán ngược trở lại ffile cad , khi viết thuyết minh, mình sẽ sử dụng luôn được dữ liệu này

Lệnh THONGKEMOC dưới đây sẽ thống kê tất cả các mốc theo định dạng bảng như bạn yêu cầu. Nó save dữ liệu vào định dạng CSV mà Excel đọc được. Bạn chạy lệnh ở ACAD sau đó mở file kết quả ở Excel.

 

(defun c:thongkemoc()
 (defun attr(ent)
   (cdr (assoc 1 (entget (entnext ent))))
 )
 (defun tk1(ent)
   (setq p (cdr (assoc 10 (entget ent)))
  x (rtos (car p) 2 3)
  y (rtos (cadr p) 2 3)
  tenmoc (attr ent)
   )
   (write-line (strcat tenmoc "," x "," y) f)
 )
 (princ "\nThong ke moc - Free lisp from CADViet.com")
 (setq ss (ssget '((0 . "INSERT")(2 . "RANH")))
fn (getfiled "Hay chon file CSV can luu!" "" "CSV" 1)
f (open fn "w")
lst (ss2ent ss)
lst (vl-sort lst '(lambda (x1 x2) (  )  
 (write-line "moc,x,y" f)
 (mapcar 'tk1 lst)  
 (close f)
 (princ)
)

(defun ss2ent(ss / sodt index lstent)
 (setq
   sodt (if ss (sslength ss) 0)	   
   index 0
 )
 (repeat sodt
   (setq ent (ssname ss index)
  index (1+ index)
  lstent (cons ent lstent)
   )
 )
 (reverse lstent)
)

(princ "\na free lisp from CADViet.com - Type THONGKEMOC to start!")
(princ)

 

Nếu bạn muốn import file CSV vào CAD, hãy dùng lisp của bạn Crazylisp ở đây: http://www.cadviet.com/forum/AutoCAD-voi-Excel-t407.html

  • 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
Nguyen Hoanh    4.524
Em đang làm san nền. Em muốn xin 1 cái lips tính khối lượng. Chẳng hạn khi em tính với ô lưới 10 hoặc 20 thì khi em gõ lệnh nó sẽ hỏi chỉ ô đất cần tính, sau đó chọn các số H đào đắp. Rùi nó tự chia trung bình và nhân với diện tích ô đất. Sau đó chọn điểm đặt vòng tròn khối lượng ( trong đó có Số thứ tự ô, Diện tích ô đất, H đắp trung bình , và khối lượng đất. Em đã tìm mấy cái lips trong này nhưng lỗi ko dùng được) Bác nào làm ơn viết hộ em 1 cái lips kiểu như thế được ko ạ? Em cám ơn trước!

Bạn hãy yêu cầu bên LandCadviet: http://www.cadviet.com/forum/LandCadViet-Utility-t2691.html

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
dotranduy    0

Cám ơn bác Hoành. Em sang bên đấy rồi nhưng ko thấy cái j liên quan đến san nền cả. Toàn trắc đạc mới đánh dấu, ghi tên thôi. Bác làm ơn viết cho em 1 cái lips như vậy được ko? Em tìm mãi rồi ko có cái lips nào như thế, toàn bị lỗi 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
ph168xd    310

Bác Hoành giúp em lish đưa Pline thành 2 line cách nhau đúng bằng độ dày của Pline

Làm ý bằng Pline, giờ phải vẽ lại hết thì toi. Mong Bác chỉ 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
Bạn dùng lisp này, lệnh BRK:

 

;;;-------------------------------------------------------------
(defun ss2ent (ss / i Le e)
(setq i 0 Le nil)
(repeat (sslength ss) 
   (setq
       e (ssname ss i)
       Le (append Le (list e))
       i (1+ i)
   )
)
Le
)
;;;-------------------------------------------------------------
(defun DXF (code e) (cdr (assoc code (entget e))) )
;;;-------------------------------------------------------------
(defun get_inters(e1 e2 / p11 p12 p21 p22)
(setq
   p11 (dxf 10 e1)  p12 (dxf 11 e1)
   p21 (dxf 10 e2) p22 (dxf 11 e2)
)
(inters p11 p12 p21 p22) 
)
;;;-------------------------------------------------------------
(defun C:BRK( / ss L Lp e1 e2 p e)
(setq
   ss (ssget '((0 . "LINE")))
   L (ss2ent ss)
   Lp nil
)
(foreach e1 L
   (foreach e2 L
       (setq p (get_inters e1 e2))
       (if (and p (not (member p Lp))) (setq Lp (append Lp (list p))))
   )
)
(foreach p Lp
   (setq
       ss (ssget "C" p p '((0 . "LINE")))
       L (ss2ent ss)
   )
   (foreach e L (command "break" e p p))
)
(princ)
)
;;;-------------------------------------------------------------

anh ơi tại sao khi em dùng lisp đó độc lập thì không sao nhưng khi em copy những dòng code đó vào file lisp mà em tổng hợp thì nó lại báo lối.

Command: brk

Select objects: Specify opposite corner: 4 found

Select objects: ; error: bad argument type: listp <Entity name: 7ef92098>

em đã thử kiểm tra và làm lại nhiều lần mà vẫn bị lỗi, anh xem giúp em. cám ơn anh nhiều

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
namng    0

Bac Hoành ah, Bác viết hộ em cái lisp tính khoảng cách giữa các đỉnh của pline theo phương ngang trong cai lisp dong đc khô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
Duongqua    0

Chao anh ban!

Mình đang thiết kế công trình nhà xưởng đầu tay, thống kê kết cấu thép bằng tay vất vả quá, anh bạn có thể cho mình xin lisp thống kê thép cho kết cấu thép được không. Mình đọc bài của anh bạn nhiều rồi, rất được, mình nghĩ là anh bạn giúp mình được 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
ssg    1.088
anh ơi tại sao khi em dùng lisp đó độc lập thì không sao nhưng khi em copy những dòng code đó vào file lisp mà em tổng hợp thì nó lại báo lối.

Command: brk

Select objects: Specify opposite corner: 4 found

Select objects: ; error: bad argument type: listp

em đã thử kiểm tra và làm lại nhiều lần mà vẫn bị lỗi, anh xem giúp em. cám ơn anh nhiều

Khả năng là lisp này và lisp bạn có sẵn bị trùng tên function nào đó.

Giải pháp: sửa tên functions trùng và các dòng code có liên quan.

Nếu bạn không tự làm được thì phải post cái lisp tổng hợp lên mình mới có thể kiểm tra và sửa giúp 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

Em muốn nhờ các bác viết hộ 1 lisp nội dung như sau:

- Có 2 đường spline bất kỳ

- Chia đều mỗi đường spline thành các đoạn nhỏ có chiều dài số đoạn (n) là bằng nhau bằng nhau (Trên mối đường spline có số đoạn chia bằng nhau nhưng chiều dài của các đoạn trên mỗi đường có thể khác nhau)

- Vẽ các đường thẳng nôi liền từ điểm chia của đường này tương ứng với các điểm chia đoạn của đường kia

(Nói tóm lại là chia đều 2 đường đó ra sau đó nối lại bằng đường thẳng qua điểm đó)

 

Mong các bá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
Nguyen Hoanh    4.524
Em muốn nhờ các bác viết hộ 1 lisp nội dung như sau:

- Có 2 đường spline bất kỳ

- Chia đều mỗi đường spline thành các đoạn nhỏ có chiều dài số đoạn (n) là bằng nhau bằng nhau (Trên mối đường spline có số đoạn chia bằng nhau nhưng chiều dài của các đoạn trên mỗi đường có thể khác nhau)

- Vẽ các đường thẳng nôi liền từ điểm chia của đường này tương ứng với các điểm chia đoạn của đường kia

(Nói tóm lại là chia đều 2 đường đó ra sau đó nối lại bằng đường thẳng qua điểm đó)

 

Mong các bác giúp!

 

Lệnh RuleLine (vì giống lệnh RuleSurf của ACAD) dưới đây sẽ giúp bạn:

 

(defun C:ruleline (/ sc ps pe d)
 (princ "\nRule Line - free lisp from cadviet.com")
 (setq    
   sc (getint "\nSo khoang chia: ")
   e1 (car (entsel "\nDuong thu nhat: "))
   d  (redraw e1 3)  
   e2 (car (entsel "\nDuong thu hai: "))
   d  (redraw e1 4)
   glength (lambda (e) (command ".lengthen" e "") (getvar "perimeter"))
   cline (lambda (a c) (entmake (list (cons 0 "line") (cons 10 a)(cons 11 c))))  
   d1 (/ (glength e1) sc)
   d2 (/ (glength e2) sc)
   l1 0.0
   l2 0.0     
 )
 (cline (vlax-curve-getStartPoint e1) (vlax-curve-getStartPoint e2))    
 (cline (vlax-curve-getEndPoint e1) (vlax-curve-getEndPoint e2))
 (repeat (1- sc)
   (setq      
     l1 (+ l1 d1)
     l2 (+ l2 d2)
     p1 (vlax-curve-getPointAtDist e1 l1)
     p2 (vlax-curve-getPointAtDist e2 l2)
   )
   (cline p1 p2)
 )   
 (princ)
)
(princ "\nType ruleline to start!!!")
(vl-load-com)

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.

×