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ị

mình thử nhập khoảng cách là 100 này, 1000 này nhưng vẫn kô được, mình chọn khoảng cách tối đa xong pick 2 đường PL xong rồi enter mà nó y chang như cũ, :s_big: liệu có phải do các đường của mình nó chéo nhau kô nhỉ

Bạn đã chạy thử Code của Tue_NV chưa?

Tue_NV đã sửa lại đọan Code của bạn ở bài viết số 2026, topic "Viết Lisp theo yêu cầu"

:s_big:

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 thử nhập khoảng cách là 100 này, 1000 này nhưng vẫn kô được, mình chọn khoảng cách tối đa xong pick 2 đường PL xong rồi enter mà nó y chang như cũ, :s_big: liệu có phải do các đường của mình nó chéo nhau kô nhỉ

 

bạn test trên file bạn đưa hay file khác. Nếu file khác thì up file đó lên để mình xem lại. Còn nếu trên file cũ mà k đc thì thật là lạ vì mình test thấy ok hết mà. Nhờ các bạn khác test thử xem và cho ý kiế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

Mình cần 1 lisp khi cóp pi 1 text ở dạng số thì tự động đối tượng sau cóp pi được cộng thêm n đơn vị, đối tượng sau nữa là cộng thêm (n+n) đơn vị, mong mọi người giúp đỡ, 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
Lần này k xong thì mình cũng pótay.com luôn.

Mình cũng không rõ vì sao lại thế nữa nhưng nó cũng không được bạn à, Mình cảm ơn bạn nhiều nha. Mình dung mấy cái lisp tính diện tích trên diễn đàn nhưng thấy chưa đúng ý mình lắm, bạn có thể cho mĩnhin cái lisp tính diện tích với các công việc sau:

1. Chạy lisp xong hỏi tỷ lệ bản vẽ,

2. Sau đó pick vào những vùng cần tính diện tích.

3. Sau khi ấn enter thì pick điểm để ghi kết quả. Rồi tiếp tục pick các vùng khác để tính tiếp

Lưu ý nếu có lỗi cũng không mất các snap ban đầu mình chọn nha.

Cảmơn 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

Mình đang cần lisp thực hiện công việc gấp vải địa kỹ thuật (trong thiêt kế trắc ngang đường) nội dung như sau:

Mình đã có sẵn nhiều đường polyline, mình muốn sau khi chạy lisp tấc cả các đường polyline đó được vẽ thêm hai đầu (gấp vào trong) một đoạn thẳng mình chọn trước. Bác nào viết giúp mình nhé. Thanhk!

Mình up file lên các bạn xem cho dể hiểu nha:

http://www.cadviet.com/upfiles/load.dwg

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
thanks bạn q288 nhưng mà vẫn kô đc bạn ah, nó kô nối được những đoạn cách nhau và những đoạn chéo nhau như lisp trước bạn ạ, nó chỉ nối được những đoạn liền nhau thôi, mong bạn sửa lại dùm mình nhé, cảm ơn bạn lần nữa.

Bạn kiểm tra lại đi nhé. Mình dùng thấy OK mà, có khi là do máy bạn đã có lisp cũ bạn chưa remove nó đi. bạn thử xóa lisp cũ đi, hoặc đồi lệnh nn thành lệnh khác để thử xem. Chúc bạn thanh 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
Mình đang cần lisp thực hiện công việc gấp vải địa kỹ thuật (trong thiêt kế trắc ngang đường) nội dung như sau:

Mình đã có sẵn nhiều đường polyline, mình muốn sau khi chạy lisp tấc cả các đường polyline đó được vẽ thêm hai đầu (gấp vào trong) một đoạn thẳng mình chọn trước. Bác nào viết giúp mình nhé. Thanhk!

Mình up file lên các bạn xem cho dể hiểu nha:

http://www.cadviet.com/upfiles/load.dwg

 

Bạn dùng cái này thử.

(defun c:thd(/ dthem os ss ss1 ent obj p1 p2 ang ang1)
 (setq	dthem (getreal "Chieu dai doan can them :")
       os (getvar "OSMODE"))
 (prompt "\nChon duong can sua:")
 (setq	ss (ssget '((0 . "LWPOLYLINE")))
ss1 (ssadd))
 (setvar "OSMODE" 0)

 (repeat (sslength ss)
   (setq ent  (ssname ss 0)
         obj  (vlax-ename->vla-object ent)
  p1   (vlax-curve-getStartPoint obj)
  p2   (vlax-curve-getEndPoint obj))
   (if (< (car p1) (car p2)) (setq ang 0 ang1 pi) (setq ang pi ang1 0))

   (command "line" p1 (polar p1 ang dthem) "") (ssadd (entlast) ss1)
   (command "line" p2 (polar p2 ang1 dthem) "") (ssadd (entlast) ss1)
   (ssadd ent ss1)
   (command "pedit" "M" ss1 "" "Y" "J" 0 "")
   (ssdel ent ss)
 )
 (setvar "OSMODE" os)
)

  • 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 có thể post yêu cầu về autolisp ở topic này.

Tạo giúp em lisp này với

-Trong bản vẽ em thường quản lý dim bằng dimflac và dimfit do đó trong bản vẽ tuy chỉ có 1 loại dim nhưng có những tỷ lệ dimflac và discale khác nhau.

-Giả sử trong bản vẽ ta có dim thứ nhất có dimflac = 1, dimscale =1 . Dim thứ 2 có dimflac = 0.5, dimscale = 0.5

-Khi vẽ em dim thứ nhất đang hiện hành bây giờ em muốn chọn dim thứ 2 làm dim hiện hành để vẽ (Ai giúp em với và nhớ đắt tên lệnh là DHH nha) . Em xin 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
chào cả nhà CADVIET, hồi trước mình có nhờ các bạn NDTVN, TUE_NV, THANHBINH viết cho mình cái lisp bắn cột đèn và bắn số cột đèn nôi dung của nó như sau :

nó sẽ tu dong rải cho mình 1 block trên 1 đoạn thẳng Pline hoặc SPline... sau đó nó sẽ đánh tên blog này theo thứ tự là T1/L1-1A rồi đến T1/L1-2B, T1/L1-3C, T1/L1-4A.....

 

bây giờ mình chỉ cần nó tu dong đánh số cho mình thôi mà kô cần rải blog kia nữa ( vì mình rải block sẵn rồi giờ chỉ đánh số thôi ) xin nhờ các bạn : lisp ấy đây

Chào bạn nguyenkhoadung98

Vì gần đây công việc nhiều quá nên không lên đây được.

Lisp đã viết cũng thoả mãn yêu cầu của bạn

Khi dùng lệnh, bạn chỉ cần chọn text chứ không chọn block.

Khi "Chon diem goc de copy :" thì bạn pick vào điểm chèn của cột tương ứng với text là được rồi.

  • 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
Bạn sử dụng đoạn Code này xem :

(defun c:ofs()
(prompt "Ban chon doi tuong offset :")
(setq ss (ssget) n (sslength ss) i 0)
(setq po (getpoint "\n Pick diem phia offset :"))
(setq kc (getdist "\n Khoang cach offset :"))
(while (< i n)
(setq curve (ssname ss i))
(command "offset" kc curve po "")
(setq LA (entlast))
(Command "point" po)
(command "MATCHPROP" (entlast) LA "")
(entdel (entlast))
(setq i (1+ i))
)
(princ)
)

Cảm ơn Tue nhiều, cái này mình dùng tốt lắm nhưng còn có chỗ mình muốn hoàn thiện hơn tí nữa bạn giúp mình với.

Mình muốn offset vào bên trong hay ra phía ngoài hình cần offset (vì những cái hình mình cần offset không thẳng nên không chọn cùng một phía cần offset được). Mình muốn khi chạy lisp nó hỏi offset vào bên trong hay ra bên ngoài hình (ví dụ như hình tròn chẳng hạn nhưng cũng có thể dùng để offet polyline nữa). Cảm ơn tue nhiều! Mình upload file cho bạn dễ hiều nha. http://www.cadviet.com/upfiles/load_1.dwg

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 Tue nhiều, cái này mình dùng tốt lắm nhưng còn có chỗ mình muốn hoàn thiện hơn tí nữa bạn giúp mình với.

Mình muốn offset vào bên trong hay ra phía ngoài hình cần offset (vì những cái hình mình cần offset không thẳng nên không chọn cùng một phía cần offset được). Mình muốn khi chạy lisp nó hỏi offset vào bên trong hay ra bên ngoài hình (ví dụ như hình tròn chẳng hạn nhưng cũng có thể dùng để offet polyline nữa). Cảm ơn tue nhiều! Mình upload file cho bạn dễ hiều nha. http://www.cadviet.com/upfiles/load_1.dwg

Để viết được bài viết này cho phép Tue_NV xin cảm ơn anh giabach rất nhiều vì bài viết của anh đã giúp Tue_NV hoàn thành đoạn Lisp này :

Chấp nhận các đối tượng là Curve

(defun c:ofs(/ oldos ss n i kc curve prtb potb po LA ans)
(vl-load-com)
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(prompt "Ban chon doi tuong offset :")
(setq ss (ssget '((0 . "LINE,POLYLINE,LWPOLYLINE,SPLINE,ARC,CIRCLE")))
n (sslength ss) i 0)

(setq kc (getdist "\n Khoang cach offset :"))

(initget "N T") ;;;Init keywords
(setq ans (getkword "\n Ban offset phia ngoai hay phia trong? [N/T] :")) 
(if (= ans "N")

(while ((setq curve (ssname ss i))
(setq prtb (/ (+ (vlax-curve-getStartParam curve) (vlax-curve-getEndParam curve)) 2))
(setq potb (vlax-curve-getPointAtParam curve prtb))
(setq po (car(get_point_curve curve potb kc)))
(command "offset" kc curve po "")
(setq LA (entlast))
(Command "point" po)
(command "MATCHPROP" (entlast) LA "")
(entdel (entlast))
(setq i (1+ i))
)
)
(if (= ans "T")

(while ((setq curve (ssname ss i))
(setq prtb (/ (+ (vlax-curve-getStartParam curve) (vlax-curve-getEndParam curve)) 2))
(setq potb (vlax-curve-getPointAtParam curve prtb))
(setq po (cadr(get_point_curve curve potb kc)))
(command "offset" kc curve po "")
(setq LA (entlast))
(Command "point" po)
(command "MATCHPROP" (entlast) LA "")
(entdel (entlast))
(setq i (1+ i))
)
)
(command "undo" "end")
(setvar "osmode" oldos)

(princ)
)
;
(defun get_point_curve (cEnt pt dis / param ang)
(if (setq param (vlax-curve-getParamAtPoint cEnt pt))
(progn
(setq ang (- (angle '(0 0 0)
(vlax-curve-getFirstDeriv cEnt param))
(/ pi 2))
)
(list (polar pt ang dis) (polar pt ang (- dis)))
)
)
)

Bạn chạy thử và cho biết ý kiến nhé :s_big:

Chỉnh sửa theo Tue_NV
  • 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
Chào bạn nguyenkhoadung98

Vì gần đây công việc nhiều quá nên không lên đây được.

Lisp đã viết cũng thoả mãn yêu cầu của bạn

Khi dùng lệnh, bạn chỉ cần chọn text chứ không chọn block.

Khi "Chon diem goc de copy :" thì bạn pick vào điểm chèn của cột tương ứng với text là được rồi.

 

 

hi cảm ơn NDTNV nhiều, điều này thì mình biết khi dùng lisp rồi, nhưng mà như vậy thì các chữ cách đều nhau 1 khoảng cố định và nó không theo các block đã có sẵn, vì block có sẵn có khoảng cách không phải đều nhau ( chênh lệch 1 ty ), ý mình là chữ nó phải theo block có sẵn ý ( như trong bản vẽ vậy ), cảm ơn bạn lần nữa

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
Để viết được bài viết này cho phép Tue_NV xin cảm ơn anh giabach rất nhiều vì bài viết của anh đã giúp Tue_NV hoàn thành đoạn Lisp này :

Chấp nhận các đối tượng là Curve

Cảm ơn Tue nhiều, cái này chạy tốt lắm! Dúng ý mình luô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

Mình có chuyện này muốn nhờ anh em diễn đàn giúp đỡ!

Mình có bảng khối lượng bên Cad muốn nhập qua Excel, Các bạn xem có thể viết cho mình một cái lisp hay chỉ cho mình cách nào để nhập qua cho nhanh nhất, vì mình có rất nhiều bảng khối lượng nhu thế mà ngồi nhìn từng bảng nhập thu công thi lại quá lâu, Cảm ơn nhiều! Mình upload file cho các bạn xem nha.

File cad: http://www.cadviet.com/upfiles/load_2.dwg

File Excel: http://www.cadviet.com/upfiles/load.xls

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 một lisp tính tổng chiều dài của các polyline và cộng thêm một số cho trước.

Khiu chạy lisp thi hỏi, số cần cộng thêm sau đó chọn các polyline, rồi pick điểm ghi text ra. Rồi lại chọn các polyline khác để tiếp tục.

Mình đang dùng lisp tính chiều dài này thấy rất hay, http://www.cadviet.com/upfiles/chieu_dai_2.lsp các bạn cố gắn viết gần giống với cái này cho mình với.

Thanhk!

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 một lisp tính tổng chiều dài của các polyline và cộng thêm một số cho trước.

Khiu chạy lisp thi hỏi, số cần cộng thêm sau đó chọn các polyline, rồi pick điểm ghi text ra. Rồi lại chọn các polyline khác để tiếp tục.

Mình đang dùng lisp tính chiều dài này thấy rất hay, http://www.cadviet.com/upfiles/chieu_dai_2.lsp các bạn cố gắn viết gần giống với cái này cho mình với.

Thanhk!

Lisp này đúng theo yêu cầu của bạn

http://www.cadviet.com/upfiles/sumCURVE.lsp

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 này đúng theo yêu cầu của bạn

http://www.cadviet.com/upfiles/sumCURVE.lsp

Mình thành thật xin lỗi vì ban đầu không nói rõ, hôm trước mình chỉ tính các polyline nên mình chỉ chọn polyline nhưng khi dùng thì lại gặp cả các line nữa nên không được, bác sữa hộ mình lần nữa nghe, không những polyline mà các line, arc, hay đường tròn đều tính được.

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
Mình muốn LISP chén đối tượng Text theo file txt gồm tọa dộ và nội dung text, ví dụ http://www.cadviet.com/upfiles/vidu.xls . Các bạn giúp mình với!!!

Ý của bạn là sao? Bạn muốn xuất toạ độ x, toạ độ Y và Text từ file .xls qua CAD luôn phải 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

ban dung doan cold nay xem thu

(defun c:sd ()

(defun ss2ent (ss / sodt index lstent)

(setq

sodt (cond

(ss (sslength ss))

(t 0)

)

index 0

)

(repeat sodt

(setq ent (ssname ss index)

index (1+ index)

lstent (cons ent lstent)

)

)

(reverse lstent)

)

(defun hoanh_newerror (msg)

(if (and (/= msg "Function cancelled")

(/= msg "quit / exit abort")

)

(princ (strcat "\n" msg))

)

(done)

)

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

(defun init ()

(setq

HOANH_CMD (getvar "CMDECHO")

HOANH_OLDERROR *error*

*error* hoanh_newerror

 

)

(setvar "CMDECHO" 0)

(command ".undo" "BE")

)

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

(defun done ()

(command ".redraw")

(command ".undo" "E")

(if HOANH_CMD

(setvar "CMDECHO" HOANH_CMD)

)

(if HOANH_OLDERROR

(setq *error* HOANH_OLDERROR)

)

(princ)

)

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

 

(defun cdim (entdt pchan pduong / tt old10

old13 old14 new10 new13 new14 p10n

p13n p14n p10o p13o p14o gocduong

gocchan pchanb pduongb loaidim

)

(defun chanvuonggoc (ph p1 p2 / ptemp pkq goc)

(setq

goc (+ (angle p1 p2) (/ pi 2.0))

ptemp (polar ph goc 1000.0)

pkq (inters ph ptemp p1 p2 nil)

)

pkq

)

(setq

tt (entget entdt)

old10 (assoc '10 tt)

old13 (assoc '13 tt)

old14 (assoc '14 tt)

p10o (cdr old10)

p13o (cdr old13)

p14o (cdr old14)

loaidim (logand (cdr (assoc '70 tt)) 7)

gocduong (cond

((= loaidim 1) (angle p13o p14o))

((= loaidim 0) (cdr (assoc '50 tt)))

(t nil)

)

pchan (cond

(pchan (list (car pchan) (cadr pchan) 0.0))

(t pchan)

)

pduong (cond

(pduong (list (car pduong) (cadr pduong) 0.0))

(t pduong)

)

 

)

(if gocduong

(progn

(if pchan

(setq

pchanb (polar pchan gocduong 1000.0)

p13n (chanvuonggoc

(list (car p13o) (cadr p13o) 0.0)

pchan

pchanb

)

p14n (chanvuonggoc

(list (car p14o) (cadr p14o) 0.0)

pchan

pchanb

)

new13 (cons 13 p13n)

new14 (cons 14 p14n)

tt (subst new13 old13 tt)

tt (subst new14 old14 tt)

)

)

(if pduong

(setq

pduongb (polar pduong gocduong 1000.0)

p10n (chanvuonggoc

(list (car p10o) (cadr p10o) 0.0)

pduong

pduongb

)

new10 (cons 10 p10n)

tt (subst new10 old10 tt)

)

)

(entmod tt)

)

)

gocduong

)

 

(defun textdimheight (ent / tmp)

(command ".copy" ent "" (list 0.0 0.0 0.0) "@")

(command ".explode" (entlast) "")

(setq tmp (cdr (assoc 40 (entget (entlast)))))

(command ".erase" "p" "")

tmp

)

(defun phia (p1 p2 p3 / x1 y1 z1 x2 y2 z2 x3 y3 z3)

(setq

x1 (car p1)

y1 (cadr p1)

z1 (caddr p1)

x2 (car p2)

y2 (cadr p2)

z2 (caddr p2)

x3 (car p3)

y3 (cadr p3)

z3 (caddr p3)

tmp (+ (* (- x1 x2) x3)

(* (- y1 y2) y3)

(* (- z1 z2) z3)

)

)

(cond

((= tmp 0.0) 0.0)

(t (/ tmp (abs tmp)))

)

)

(defun khoangcachdim (p1 ent goc / tt p2 A B D)

(setq tt (entget ent)

p2 (cdr (assoc 10 tt))

B (cdr (assoc 50 tt))

A (angle p1 p2)

D (distance p1 p2)

)

(* (* D (sin (- A B ))) (phia p1 (polar p1 goc 1.0) p2))

)

 

(defun phanloai (ent)

(setq

kc (khoangcachdim pgoc ent goc)

loai (fix (/ kc heightdimgoc 0.93))

)

(cons loai ent)

)

 

(init)

(princ "\nSap xep dim © CADViet.com")

(while (not (setq entgoc (car (entsel "\nChon duong dim goc: "))))

)

(setq

ttgoc (entget entgoc)

p13goc (cdr (assoc 13 ttgoc))

pgoc (cdr (assoc 10 ttgoc))

goc (cdr (assoc 50 ttgoc))

heightdimgoc (textdimheight entgoc)

ssd (ssget (list

(cons 0 "DIMENSION")

(cons -4 "

(cons 70 32)

(cons 70 64)

(cons 70 96)

(cons 70 128)

(cons 70 160)

(cons 70 196)

(cons 70 224)

(cons -4 "OR>")

(cons -4 "

(cons 50 goc)

(cons 50 (+ goc pi))

(cons 50 (- goc pi))

(cons -4 "OR>")

)

)

lstd (ss2ent ssd)

lstd (mapcar 'phanloai lstd)

lstlevel nil

)

(foreach pp lstd

(if (not (member (car pp) lstlevel))

(setq lstlevel (append lstlevel (list (car pp))))

)

)

(setq lstlevel (vl-sort lstlevel '(lambda (x1 x2) (< x1 x2)))

lstam nil

lstduong nil

lstamtmp nil

lstduongtmp nil

)

(foreach pp lstlevel

(if (< pp 0.0)

(setq lstam (append lstam (list pp)))

)

(if (> pp 0.0)

(setq lstduong (append lstduong (list pp)))

)

)

(setq index 0)

(foreach pp (reverse lstam)

(setq

index (1+ index)

lstamtmp (append lstamtmp (list (cons pp index)))

)

)

(setq

lstam lstamtmp

index 0

)

(foreach pp lstduong

(setq

index (1+ index)

lstduongtmp (append lstduongtmp (list (cons pp index)))

)

)

(setq lstduong lstduongtmp)

(setq lstlevel (append lstduong lstam (list (cons 0.0 0))))

 

(setq kcdimstandard (* 3.0 heightdimgoc))

(foreach pp lstd

(setq plht (car pp))

(progn

(setq

kcdimht (khoangcachdim pgoc (cdr pp) goc)

duongthu (cdr (assoc plht lstlevel))

heso (cond

((/= 0 kcdimht)

(abs (* (/ kcdimstandard kcdimht) duongthu))

)

(t 0.0)

)

diemchenht (cdr (assoc 10 (entget (cdr pp))))

pmoi (polar pgoc

(angle pgoc diemchenht)

(* heso (distance pgoc diemchenht))

)

)

 

(cdim (cdr pp) p13goc pmoi)

)

)

(done)

)

(princ "\nSap xep dim, SD - free lisp from www.cadviet.com")

(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
Mình thành thật xin lỗi vì ban đầu không nói rõ, hôm trước mình chỉ tính các polyline nên mình chỉ chọn polyline nhưng khi dùng thì lại gặp cả các line nữa nên không được, bác sữa hộ mình lần nữa nghe, không những polyline mà các line, arc, hay đường tròn đều tính được.

Thank!

Đây là lisp sum của các curve, bạn chỉ cần thêm các tên đưởng: "LWPOLYLINE,LINE,SPLINE,ARC,CIRCLE" là đượ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
Ý của bạn là sao? Bạn muốn xuất toạ độ x, toạ độ Y và Text từ file .xls qua CAD luôn phải không?

Đúng rồi, có gì nhờ Tue_NV và các bạn giúp đỡ. 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×