Đến nội dung


Hình ảnh
* * * - - 2 Bình chọn

Viết Lisp theo yêu cầu


  • Chủ đề bị khóa Chủ đề bị khóa
2780 replies to this topic

#2061 conghoan1003

conghoan1003

    biết vẽ point

  • Members
  • PipPip
  • 99 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 29 May 2009 - 03:12 PM

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.c...iles/load_1.dwg
  • 0
Học học nữa học mãi.
Đúp học lại!

#2062 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 29 May 2009 - 04:25 PM

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.c...iles/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 (< i n)
(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 (< i n)
(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:

Bài viết đã được chỉnh sửa nội dung bởi Tue_NV: 29 May 2009 - 10:22 PM

  • 2

#2063 nguyenkhoadung98

nguyenkhoadung98

    biết vẽ pline

  • Members
  • PipPip
  • 62 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 29 May 2009 - 05:30 PM

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

#2064 conghoan1003

conghoan1003

    biết vẽ point

  • Members
  • PipPip
  • 99 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 29 May 2009 - 10:02 PM

Để 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
  • 0
Học học nữa học mãi.
Đúp học lại!

#2065 phuchauctc

phuchauctc

    Chưa sử dụng CAD

  • Members
  • Pip
  • 3 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 31 May 2009 - 09:20 AM

Cảm ơn về lời góp ý của bạn Tue_NV và rất mong sự giúp đỡ của bạn cũng như mọi người trên diễn đàn này.
  • 0

#2066 conghoan1003

conghoan1003

    biết vẽ point

  • Members
  • PipPip
  • 99 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 01 June 2009 - 09:00 AM

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.c...iles/load_2.dwg
File Excel: http://www.cadviet.c...pfiles/load.xls
  • 0
Học học nữa học mãi.
Đúp học lại!

#2067 conghoan1003

conghoan1003

    biết vẽ point

  • Members
  • PipPip
  • 99 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 01 June 2009 - 09:12 AM

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.c...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!
  • 0
Học học nữa học mãi.
Đúp học lại!

#2068 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 01 June 2009 - 12:22 PM

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.c...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.c...es/sumCURVE.lsp
  • 0

#2069 conghoan1003

conghoan1003

    biết vẽ point

  • Members
  • PipPip
  • 99 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 01 June 2009 - 01:34 PM

Lisp này đúng theo yêu cầu của bạn
http://www.cadviet.c...es/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!
  • 0
Học học nữa học mãi.
Đúp học lại!

#2070 baodenhp

baodenhp

    biết vẽ arc

  • Members
  • PipPip
  • 41 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 01 June 2009 - 02:22 PM

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.c...pfiles/vidu.xls . Các bạn giúp mình với!!!
  • 0

#2071 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 01 June 2009 - 02:34 PM

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.c...pfiles/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?
  • 0

#2072 thanhlam03xt

thanhlam03xt

    biết vẽ pline

  • Members
  • PipPip
  • 64 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 01 June 2009 - 04:09 PM

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)
  • 0
Sống trên đời cần có một tấm lòng.....

#2073 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 01 June 2009 - 05:01 PM

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

#2074 baodenhp

baodenhp

    biết vẽ arc

  • Members
  • PipPip
  • 41 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 01 June 2009 - 05:25 PM

Ý 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!!
  • 0

#2075 manhhoql

manhhoql

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 01 June 2009 - 05:27 PM

Cho mình xin lisp mà khi mình quay text nhưng text nó vẫn nằm ngang được khôn. Cảm ơn trước các pro đã chỉ dẫn!
  • 0

#2076 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 01 June 2009 - 06:57 PM

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.c...pfiles/vidu.xls . Các bạn giúp mình với!!!

@baodenhp :
Bạn hãy đọc bài viết này của Tue_NV. Đọc kỹ nhé. Nếu có gì chưa được hãy post lên đây :
http://www.cadviet.c...showtopic=10969

@Manhhoql : "Cho mình xin lisp mà khi mình quay text nhưng text nó vẫn nằm ngang được không?"
Bạn có thể nói rõ ý này được không? Tue_NV chưa hiểu ý
  • 1

#2077 conghoan1003

conghoan1003

    biết vẽ point

  • Members
  • PipPip
  • 99 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 02 June 2009 - 07:54 AM

Đâ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

Nhờ bác Thiêp thêm giúp mình với nha, mình chưa từng học lisp nên chẳng biết tí nào cả. Cảm ơn nha!
  • 0
Học học nữa học mãi.
Đúp học lại!

#2078 nguyenh001

nguyenh001

    biết zoom

  • Members
  • Pip
  • 12 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 02 June 2009 - 11:22 AM

mình đang cần list tính tổng chiều dài các dim, xin nhờ mọi người viết hộ và chỉ giúp cách viết, các hàm lấy thuộc tính của dim
cám ơn mọi ng nhiều
  • 0

#2079 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 02 June 2009 - 11:42 AM

mình đang cần list tính tổng chiều dài các dim, xin nhờ mọi người viết hộ và chỉ giúp cách viết, các hàm lấy thuộc tính của dim
cám ơn mọi ng nhiều

Hàm sau lấy giá trị của dim :
(alert(rtos (cdr(assoc 42 (entget(car(entsel))))) 2 0))

1. đầu tiên bạn chọn dim : dùng ssget
2. Khởi tạo biến tổng dim S = 0, biến đếm i = 0, số đối tượng n dim : hàm sslength
2. Duyệt qua các Dim : hàm while. Qua từng giá trị dim lấy giá trị của dim.-> tính tổng
3. In giá trị của tổng Dim

Bạn hãy xây dựng thử. Có gì Tue_NV và mọi người sẽ hỗ trợ cho bạn
  • 0

#2080 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 02 June 2009 - 12:20 PM

mình đang cần list tính tổng chiều dài các dim, xin nhờ mọi người viết hộ và chỉ giúp cách viết, các hàm lấy thuộc tính của dim
cám ơn mọi ng nhiều

Chào bạn nguyenh001,
Bạn cần nói rõ hơn yêu cầu của bạn mới được. Bạn muốn lấy tổng các giá trị của các dim hay lấy tổng chiều dài thực của các kích thước này.
Bác Tue_NV đã gợi ý bạn về cách làm nhưng bạn lưu ý rằng các giá trị đó chính là kích thước thực của đoạn bạn lấy đim chứ không phải là kích thước bạn độ chế đâu.
Nếu bản vẽ của bạn có các kích thước độ chế lại thì cái lisp đó sẽ không hoạt động đúng được.
Các thuộc tình của dim ý bạn hỏi có phải là các mã DXF của nó không. Nếu vậy thì bạn dùng hàm (entget) sẽ có được các mã này. Việc sử dụng các mã này là tùy thuộc vào yêu cầu của bạn.
Chúc bạn vui.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.