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ột hàng là một hay nhiều đối tượng text?

Một dòng là một hay nhiều đối tượng text?

 

Bạn đừng có dùng chữ hàng hay dòng bởi vì nó không sáng hơn bài viết trước của bạn chút nào. Bạn hãy trả lời câu hỏi bài viết trước của tôi: cho tôi biết trong ví dụ đầu tiên của bạn có bao nhiêu đối tượng text? 2 hay 12?

 

Nếu có thể tránh hiểu nhầm, bạn hãy upload 1 file dwg lên diễn đàn. Tôi không ngại viết lisp nhưng tôi ngại viết sai ý bạn, vì khi tôi đã viết tôi sẽ không sửa lisp nữa.

Xin lỗi bác Hoành! Trình độ của em kém quá nên diễn đạt khó hiểu làm Bác mất công. Bác thông cảm và giúp em nhé!

Ví dụ ban đầu của em có 12 đối tượng 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
Xin lỗi bác Hoành! Trình độ của em kém quá nên diễn đạt khó hiểu làm Bác mất công. Bác thông cảm và giúp em nhé!

Ví dụ ban đầu của em có 12 đối tượng text.

Lệnh CONG, TRU, NHAN, CHIA dưới đây sẽ làm điều bạn cần:

 

(defun c:cong () (xulytext +))
(defun c:tru () (xulytext -))
(defun c:nhan () (xulytext *))
(defun c:chia () (xulytext /))

(defun xulytext	(ham / lst1 lst2 sst1 sst2 ykq)
 (princ "\nNhap vao hang text dau tien: ")
 (setq sst1 (ssget '((0 . "TEXT"))))
 (princ "\nNhap vao hang text thu hai: ")
 (setq sst2 (ssget '((0 . "TEXT"))))

 (if (/= (sslength sst1) (sslength sst2))
   (alert
     "\nHai tap chon co so doi tuong khong bang nhau!\nHay chon lai!"
   )
   (progn
     (setq
lst1   (mapcar 'entget (ss2ent sst1))
lst2   (mapcar 'entget (ss2ent sst2))
Ykq    (- (* 2 (caddr (assoc 10 (car lst2)))) (caddr (assoc 10 (car lst1))))
lsterr ""
     )
     (mapcar
'entmake
(mapcar	'(lambda (t1 t2 / tt pp gt)
	   (setq gt (vl-catch-all-apply
		      'ham
		      (list (atof (cdr (assoc 1 t1)))
			    (atof (cdr (assoc 1 t2)))
		      )
		    )
	   )
	   (if (vl-catch-all-error-p gt)
	     (setq lsterr (strcat lsterr "- " (vl-catch-all-error-message gt) "\n")
		   gt	  "#"
	     )
	     (setq gt (vl-string-right-trim "." (vl-string-right-trim "0" (rtos gt))))
	   )
	   (setq
	     p	(cdr (assoc 10 t1))
	     pp	(list 10 (car p) Ykq (caddr p))
	     tt	(subst (cons 1 gt) (assoc 1 t1) t1)
	     tt	(subst pp (assoc 10 t1) tt)
	   )
	 )
	lst1
	lst2
)
     )
     (if (/= lsterr "")
(alert
  (strcat "Trong qua trinh tinh toan, co cac loi sau:\n"
	  lsterr
  )
)
     )
   )
 )
)
(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)
)

  • 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
Jin thì nghĩ Khung Tên nên được làm thành một Block Attrributes, như vậy thì mình có thể copy thoải mái mà không sợ sót, và chỉ cần chỉnh sửa một vài khoản mục cần thiết (tên công trình, tên bản vẽ...)

Mình mới tập toạnh vẽ cad.Jinnói rõ hơn muc block Ảttibtets làm sao cho cái khng tên không bị thay đổi khi áp dụng vào nhiều bản vẽ khác nhau trên A1,A2,A4.Hướng dẫn cách làm cụ thể một khung mẫu để sau khi vẽnhiều công trình chỉ cần thay tên công trình thôi . Cho file đính kèm một khung mẫu do bạn tao và cách thức thực hành khi áp dụng vớinhiều bãn vẽ A1..A4 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

- Thế này nhá bác Hoanh

- Tớ có 1 hình thể có nhiều tọa độ pline là 586888.xxxx,1186244.xxxx ,chú ý nhiều tọa độ pline nhập lại thành 1 hình thể có 1 diện tích là 500m2 chẳng hạn, lisp mình đưa ở trên sẽ lấy từ hình thể mình vẽ xuất ra các tọa độ là 586888.xx,1186244.xx chỉ còn giá trị chẵn thôi không còn giá trị xxxx nữa mà là xx chính vì thế diện tích sẽ có thể mất đi chẳng hạn 475m2

- Tới lúc này mình phải kéo hình thể lại ,sao cho bằng diện tích mà vẫn đúng giá trị chẵn xx ,

- Ý mình là bạn có thể sửa lại lisp này sao cho xuất ra giá trị tọa độ Pline chẵn mà phần diện tích không bị lệnh dù lệch cũng ít nhất là 499.9 không lệnh càng ít càng tốt

- chỉ chạy trên layer 10 nha Bác Hoanh lệnh command là nth thanks bác nhiều có gì không hiểu nữa mình sẽ đưa bản cad thí dụ lên . Mấy hôm nay tai đi làm lâu lâu mới online được bác thông cảm 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
- Thế này nhá bác Hoanh

- Tớ có 1 hình thể có nhiều tọa độ pline là 586888.xxxx,1186244.xxxx ,chú ý nhiều tọa độ pline nhập lại thành 1 hình thể có 1 diện tích là 500m2 chẳng hạn, lisp mình đưa ở trên sẽ lấy từ hình thể mình vẽ xuất ra các tọa độ là 586888.xx,1186244.xx chỉ còn giá trị chẵn thôi không còn giá trị xxxx nữa mà là xx chính vì thế diện tích sẽ có thể mất đi chẳng hạn 475m2

- Tới lúc này mình phải kéo hình thể lại ,sao cho bằng diện tích mà vẫn đúng giá trị chẵn xx ,

- Ý mình là bạn có thể sửa lại lisp này sao cho xuất ra giá trị tọa độ Pline chẵn mà phần diện tích không bị lệnh dù lệch cũng ít nhất là 499.9 không lệnh càng ít càng tốt

- chỉ chạy trên layer 10 nha Bác Hoanh lệnh command là nth thanks bác nhiều có gì không hiểu nữa mình sẽ đưa bản cad thí dụ lên . Mấy hôm nay tai đi làm lâu lâu mới online được bác thông cảm nha

 

Bây giờ thì tôi đã hiểu bạn muốn gì nhưng cái này quá khó với lisp. Đến tận bây giờ, tôi vẫn không biết cách kéo hình như thế nào để các đỉnh pline chẵn mà diện tích lại như mong muốn. Nếu bạn mô tả được cách làm bằng tay, tôi sẽ viết được bằng lisp.

 

Bác Ssg xem có giúp được gì hơn chă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
Xin lỗi bác Hoành! Trình độ của em kém quá nên diễn đạt khó hiểu làm Bác mất công. Bác thông cảm và giúp em nhé!

Ví dụ ban đầu của em có 12 đối tượng text.

Em đã chạy thử Lisp Cộng - trừ - nhân - chia hai dãy text bác Hoành gửi nhưng gặp phải lỗi sau nhờ bác chỉ giáo thêm.

Lỗi khi thực hiện lệnh "Cong" trên AutoCad2007 với 6 đối tượng text:

Command: cong

 

Nhap vao hang text dau tien:

Select objects: Specify opposite corner: 3 found

 

Select objects:

 

Nhap vao hang text thu hai:

Select objects: Specify opposite corner: 3 found

 

Select objects:

; error: no function definition: SS2ENT

 

Lỗi khi thực hiện lệnh "Cong" trên AutoCad14 với 10 đối tượng text:

:

Command: cong

 

Nhap vao hang text dau tien:

Select objects: Other corner: 5 found

 

Select objects:

 

Nhap vao hang text thu hai:

Select objects: Other corner: 5 found

 

Select objects:

error: null function

(SS2ENT SST1)

(MAPCAR (QUOTE ENTGET) (SS2ENT SST1))

(SETQ LST1 (MAPCAR (QUOTE ENTGET) (SS2ENT SST1)) LST2 (MAPCAR (QUOTE ENTGET)

(SS2ENT SST2)) YKQ (- (* 2 (CADDR (ASSOC 10 (CAR LST2)))) (CADDR (ASSOC 10 (CAR

LST1)))) LSTERR "")

(PROGN (SETQ LST1 (MAPCAR (QUOTE ENTGET) (SS2ENT SST1)) LST2 (MAPCAR (QUOTE

ENTGET) (SS2ENT SST2)) YKQ (- (* 2 (CADDR (ASSOC 10 (CAR LST2)))) (CADDR (ASSOC

10 (CAR LST1)))) LSTERR "") (MAPCAR (QUOTE ENTMAKE) (MAPCAR (QUOTE (LAMBDA (T1

T2 / TT PP GT) (SETQ GT (VL-CATCH-ALL-APPLY (QUOTE HAM) (LIST (ATOF (CDR (ASSOC

1 T1))) (ATOF (CDR (ASSOC 1 T2)))))) (IF (VL-CATCH-ALL-ERROR-P GT) (SETQ LSTERR

(STRCAT LSTERR "- " (VL-CATCH-ALL-ERROR-MESSAGE GT) "\n") GT "#") (SETQ GT

(VL-STRING-RIGHT-TRIM "." (VL-STRING-RIGHT-TRIM "0" (RTOS GT))))) (SETQ P (CDR

(ASSOC 10 T1)) PP (LIST 10 (CAR P) YKQ (CADDR P)) TT (SUBST (CONS 1 GT) (ASSOC

1 T1) T1) TT (SUBST PP (ASSOC 10 T1) TT)))) LST1 LST2)) (IF (/= LSTERR "")

(ALERT (STRCAT "Trong qua trinh tinh toan, co cac loi sau:\n" LSTERR))))

(IF (/= (SSLENGTH SST1) (SSLENGTH SST2)) (ALERT "\nHai tap chon co so doi tuong

khong bang nhau!\nHay chon lai!") (PROGN (SETQ LST1 (MAPCAR (QUOTE ENTGET)

(SS2ENT SST1)) LST2 (MAPCAR (QUOTE ENTGET) (SS2ENT SST2)) YKQ (- (* 2 (CADDR

(ASSOC 10 (CAR LST2)))) (CADDR (ASSOC 10 (CAR LST1)))) LSTERR "") (MAPCAR

(QUOTE ENTMAKE) (MAPCAR (QUOTE (LAMBDA (T1 T2 / TT PP GT) (SETQ GT

(VL-CATCH-ALL-APPLY (QUOTE HAM) (LIST (ATOF (CDR (ASSOC 1 T1))) (ATOF (CDR

(ASSOC 1 T2)))))) (IF (VL-CATCH-ALL-ERROR-P GT) (SETQ LSTERR (STRCAT LSTERR "-

" (VL-CATCH-ALL-ERROR-MESSAGE GT) "\n") GT "#") (SETQ GT (VL-STRING-RIGHT-TRIM

"." (VL-STRING-RIGHT-TRIM "0" (RTOS GT))))) (SETQ P (CDR (ASSOC 10 T1)) PP

(LIST 10 (CAR P) YKQ (CADDR P)) TT (SUBST (CONS 1 GT) (ASSOC 1 T1) T1) TT

(SUBST PP (ASSOC 10 T1) TT)))) LST1 LST2)) (IF (/= LSTERR "") (ALERT (STRCAT

"Trong qua trinh tinh toan, co cac loi sau:\n" LSTERR)))))

(XULYTEXT +)

(C:CONG)

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 đã chạy thử Lisp Cộng - trừ - nhân - chia hai dãy text bác Hoành gửi nhưng gặp phải lỗi sau nhờ bác chỉ giáo thêm.

Lỗi khi thực hiện lệnh "Cong" trên AutoCad2007 với 6 đối tượng text:

Command: cong

 

Nhap vao hang text dau tien:

Select objects: Specify opposite corner: 3 found

 

Select objects:

 

Nhap vao hang text thu hai:

Select objects: Specify opposite corner: 3 found

 

Select objects:

; error: no function definition: SS2ENT

Xin lỗi bạn, tôi quên mất cho hàm ss2ent vào.

 

Bạn copy đoạn mã dưới đây nối thêm vào cuối cùng của phần lisp trên:

(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)
)

Hoặc copy lại code lisp ở bài viết trước của tôi, tôi đã edit cho đú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

Em hỏi tý!

Em tính san nền, có rất nhiều Block tạo từ lệnh ATTDEF (ATTRIBUTE)

Cái giá trị thể tích của nó cũng nằm trong 1 block này

em muốn tính tổng tất cả các số trong block này (khối lwợng đào đắp) , thì ok

Nhưng mà chỉ tính 1 phần trong số những block đó thì có cách nào không ạ!

 

Phá khối thì nó lại không đwợc!

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
Em hỏi tý!

Em tính san nền, có rất nhiều Block tạo từ lệnh ATTDEF (ATTRIBUTE)

Cái giá trị thể tích của nó cũng nằm trong 1 block này

em muốn tính tổng tất cả các số trong block này (khối lwợng đào đắp) , thì ok

Nhưng mà chỉ tính 1 phần trong số những block đó thì có cách nào không ạ!

 

Phá khối thì nó lại không đwợc!

Em xin cảm ơn!

Phải up cái Block đó lên Bác Hoành mới trả lời đc.

Hoặc Bác có thể tham khảo file dưới đây.

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

mà chỉnh lại cho đúng với cái Block của Bác.

  • 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
Em hỏi tý!

Em tính san nền, có rất nhiều Block tạo từ lệnh ATTDEF (ATTRIBUTE)

Cái giá trị thể tích của nó cũng nằm trong 1 block này

em muốn tính tổng tất cả các số trong block này (khối lwợng đào đắp) , thì ok

Nhưng mà chỉ tính 1 phần trong số những block đó thì có cách nào không ạ!

 

Phá khối thì nó lại không đwợc!

Em xin cảm ơn!

File đây bác

http://www.cadviet.com/upfiles/tongATT.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
Xin lỗi bạn, tôi quên mất cho hàm ss2ent vào.

 

Bạn copy đoạn mã dưới đây nối thêm vào cuối cùng của phần lisp trên:

(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)
)

Hoặc copy lại code lisp ở bài viết trước của tôi, tôi đã edit cho đúng.

 

Em thực hiện các phép tính "Cong" "Tru" "Nhân" "Chia" đều thành công. Chỉ có phép phép "Nhân" cho kết quả tận cùng là các chữ số không (0) đều không hiển thị số không. Ví dụ 4*5=2, 5*20=1...

Một vấn đề nữa là kết quả nằm trùng lên dãy text chọn đầu tiên do đó rất khó xem kết quả. Bác có thể sửa cho em kết quả nằm ở vị trí có toạ độ Y bất kỳ tự chọn trên màn hình 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

-Bác Hoành ơi vậy bác có thể viết giùm mình 1 lisp pick chọn số liệu tọa độ không không cần nhập tọa độ lại không,

-Mỗi lần nhập lại Pline phải gõ lại tọa độ có khi gõ sai nữa , phải gõ lại mệt thiệt có khi cần cả mấy chục điểm tọa độ pline gõ lại muốn mỏi tay luôn bác giúp giùm cái nha dù sao cũng thank bác 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
-Bác Hoành ơi vậy bác có thể viết giùm mình 1 lisp pick chọn số liệu tọa độ không không cần nhập tọa độ lại không,

-Mỗi lần nhập lại Pline phải gõ lại tọa độ có khi gõ sai nữa , phải gõ lại mệt thiệt có khi cần cả mấy chục điểm tọa độ pline gõ lại muốn mỏi tay luôn bác giúp giùm cái nha dù sao cũng thank bác nhiều

'Số liệu tọa độ' là cái gì bạn?

Bạn có thể nói rõ không? hoặc bạn upload được 1 file lên diễn đàn là tốt nhấ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

anh cho em xin một lisp gồm 3 lệnh giống như lệnh layer iso, lay on và lay off nhưng chức năng là đóng băng và phá băng lớp. các lớp được chọn bằng cách select trên màn hình. cám ơn anh!

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
anh cho em xin một lisp gồm 3 lệnh giống như lệnh layer iso, lay on và lay off nhưng chức năng là đóng băng và phá băng lớp. các lớp được chọn bằng cách select trên màn hình. cám ơn anh!

bạn thử lệnh LAYFRZ và LAYTHW chư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

Các bác ơi.

Tôi là người mới làm quen với Cad nhưng khi tham gia diễn đàn thấy mấy bác hướng dẫn những câu lệnh hay quá, ví như eattext

Tôi đang có rất nhiều điểm trong một bản vẽ cần chuyển toạ độ của chúng sang dạng .txt hay exel thì làm thế nào?

Có pác nào biết thì chỉ 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
Các bác ơi.

Tôi là người mới làm quen với Cad nhưng khi tham gia diễn đàn thấy mấy bác hướng dẫn những câu lệnh hay quá, ví như eattext

Tôi đang có rất nhiều điểm trong một bản vẽ cần chuyển toạ độ của chúng sang dạng .txt hay exel thì làm thế nào?

Có pác nào biết thì chỉ giúp tôi với.

Bạn hãy nêu rõ yêu cầu hơn. Vì tôi thấy trên diễn đàn cũng đã có 1 số lisp xuất dữ liệu CAD sang dạng txt.

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 các huynh giúp e!!

e đã có các lisp như : tạo các layer, các kiểu dim, các text...

giờ em muốn mỗi khi mở cad thi các lisp đó đã được mặc định, tức là đã

có các layer,dim...

xin cám ơn các a nhiều 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
xin các huynh giúp e!!

e đã có các lisp như : tạo các layer, các kiểu dim, các text...

giờ em muốn mỗi khi mở cad thi các lisp đó đã được mặc định, tức là đã

có các layer,dim...

xin cám ơn các a nhiều nhiều

Bạn tạo 1 file mẫu, rồi save file đó vào: acad.dwt, mỗi lần new 1 file, chương trình sẽ chọn theo file này làm mẫ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 nhờ các bác viết giúp 1lisp nhé: mình có 1file *txt trongđó format file như sau: tên điểm Toạ độ X toạ độ Y cao h

 

mình muốn có file lisp Import lên bản vẽ mà trên bản vẽ hiện lên tên điểm đó và ngược lại export ra file *.txt có định dạng như trên. 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
Bạn tạo 1 file mẫu, rồi save file đó vào: acad.dwt, mỗi lần new 1 file, chương trình sẽ chọn theo file này làm mẫu.

A có thể nói rỏ hơn ko, e làm như a nói nhưng ko đc, e mới mày mò thôi, mong a thông cảm. thank

ah! a cho e hỏi thêm tí nữa : file có đuôi là *.-ls file ; *.arx ; *.sld , a cho e biết những chức năng của những file này đc ko??

thank 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
A có thể nói rỏ hơn ko, e làm như a nói nhưng ko đc, e mới mày mò thôi, mong a thông cảm. thank

ah! a cho e hỏi thêm tí nữa : file có đuôi là *.-ls file ; *.arx ; *.sld , a cho e biết những chức năng của những file này đc ko??

thank a

1) Yêu cầu của bạn không liên quan gì đến lisp

2) Cách làm cụ thể:

- Tạo 1 bản vẽ mới, tự thiết lập layer, textstyle, dimstyle, linestyle, khung bản vẽ, khung tên... mẫu theo ý bạn

- Saveas *.dwt (tên gì tuỳ bạn, không nhất thiết là acad.dwt) -> bạn đã có 1 bản vẽ mẫu dạng *.dwt (AutoCAD Drawing Template), được lưu trữ để sử dụng nhiều lần sau này.

- Lập bản vẽ mới theo mẫu: Lệnh New - trong hộp thoại Create New Drawing, chọn nút "Use a template", chỉ định file *.dwt mà bạn đã lưu trữ nói trên.

Kết quả: toàn bộ các thiết lập trước đây của bạn được gán cho bản vẽ mới vừa tạo, không phải mất công làm lại các thao tác (khá mất thời gian và nhàm chán) đó nữa.

3) Bạn chưa nắm được cách tạo và dùng *.dwt tức là chưa vượt qua giai đoạn "AutoCAD cơ bản", đừng để ý đến các file *.sld, *.arx làm gì cho nó mệt người. Hãy đợi đấ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

Bác Hoành ơi , em đã đọc và sử dụng lệnh Cinvis của bác . Vậy bác có thể giúp em viết lisp hiện đối tượng theo màu không . Ví dụ như chỉ hiện đối tượng có màu đỏ chẳng hạn . Em rất khâm phục bác . Trình độ Lisp của bác em học cả đời chắc cũng ko theo nổ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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×