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

#941 makhongbietnoi

makhongbietnoi

    biết vẽ point

  • Members
  • PipPip
  • 95 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 06 August 2008 - 11:24 AM

Cảm ơn bác, nhân tiện đây tôi cũng muốn nhờ luôn các bác:
Tôi cũng đã tìm chủ đề về Wipeout trên diễn đàn nhưng chưa được như mong muốn.
Tôi muốn biến 1 đường tròn thành 1 Wipeout. Thực ra, đường tròn cũng tạo bởi các đoạn thẳng, nên có thể chia nó ra thành nhiều đoạn thẳng nhỏ, sau đó Join chúng lại thành 1 Pline kín và dùng lệnh Wipeout. Độ mịn của đường tròn lúc đó sẽ phụ thuộc vào số khoảng chia mà ta chọn.
Như vậy Lisp sẽ yêu cầu chọn đối tượng là đường tròn cần chuyển. Chọn số khoảng chia.và sau đó thực hiện.
Mong các bác giúp đỡ!
  • 0

#942 Nộ Thiên

Nộ Thiên

    biết lệnh ddedit

  • Members
  • PipPipPipPip
  • 297 Bài viết
Điểm đánh giá: 133 (tàm tạm)

Đã gửi 06 August 2008 - 01:23 PM

Chết thật, đang type thì đã có bác post trước rồi :s_big:
Bác vndesperados ạ, hàm atof, hay rtos ko được thông minh lắm đâu, nếu gặp tham số là chuỗi ký tự thì nó trả về giá trị 0 chứ ko gây lỗi đâu


Lisp cũng có nhiều cái hay phết.
Nhân dịp nhắc đến điều này, mình cũng xin lưu ý đến các Bác đang vật lộn với lisp (cái này mình vấp phải lúc mới quen với lisp):
Kết quả của phép chia 1 số nguyên cho 1 số nguyên là 1 số nguyên.???
(/ 5 3) = 1
(/ 3 5) = 0
(/ -5 3) = -1
Nếu kg biết đc cái này các Bác sẽ kg biết tại sao chtrình của mình lập chạy kg đúng như ý hoặc thậm chí là lỗi.
  • 0

#943 Nộ Thiên

Nộ Thiên

    biết lệnh ddedit

  • Members
  • PipPipPipPip
  • 297 Bài viết
Điểm đánh giá: 133 (tàm tạm)

Đã gửi 06 August 2008 - 01:24 PM

(bị double do lỗi mạng)
  • 0

#944 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 06 August 2008 - 02:01 PM

Lisp cũng có nhiều cái hay phết.
Nhân dịp nhắc đến điều này, mình cũng xin lưu ý đến các Bác đang vật lộn với lisp (cái này mình vấp phải lúc mới quen với lisp):
Kết quả của phép chia 1 số nguyên cho 1 số nguyên là 1 số nguyên.???
(/ 5 3) = 1
(/ 3 5) = 0
(/ -5 3) = -1
Nếu kg biết đc cái này các Bác sẽ kg biết tại sao chtrình của mình lập chạy kg đúng như ý hoặc thậm chí là lỗi.

Khắc phục cái này như sau
(/ 5.0 3.0) = mình thấy vớ vẩn vậy nhưng máy nó không như mình. :s_big:
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#945 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 06 August 2008 - 02:05 PM

Tôi biết chuyện đó bạn ạh, nhưng như thế thì cũng gây ra một sự thay đổi không đúng theo mong muốn của người dùng rùi. Theo tôi nên có thểm một hàm kiểm tra là số hay chuỗi ký tự trước khi thực hiện thay đổi

Đúng rồi lổi này rất phiền. Ví dụ tôi viết lisp tính trung bình các số nếu nó không loại bỏ các chuổi ra khỏi việc tính toán thì kết quả sẽ sai vì trong tổng thì không có giá trị của nó nhưng khi chia lấy trung bình thì chia cả phần của nó nên ........ :s_big:
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#946 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 06 August 2008 - 02:31 PM

Đúng rồi lổi này rất phiền. Ví dụ tôi viết lisp tính trung bình các số nếu nó không loại bỏ các chuổi ra khỏi việc tính toán thì kết quả sẽ sai vì trong tổng thì không có giá trị của nó nhưng khi chia lấy trung bình thì chia cả phần của nó nên ........ :s_big:



Tặng các bác hàm kiểm tra một chuỗi có phải là số hay không

;=====Ham kiem tra chuoi co la so hay khong======
(DEFUN IsNumeric (str / kq n1 n2 l)
(setq kq Nil)
(setq n1 0)
(setq n2 0)
(if (= (substr str 1 1)"-")
(setq str (substr str 2 (- (strlen str) 1))))

(setq l (strlen str))
(if (= (substr str 1 1)".")
(setq kq Nil)
(progn
(setq i 1)
(while (<= i l)
(setq a (substr str i 1))
(if (and (> (ascii a)47) (< (ascii a)58))
(setq n1 (+ n1 1))
)
(if (= a ".")
(setq n2 (+ n2 1))
)
(setq i (+ i 1))
)
(if (and (<= n2 1) (= (+ n2 n1)l))
(setq kq T)
)
)
)
kq
)

  • 1

#947 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 06 August 2008 - 03:17 PM

[quote name='vndesperados' post='26757' date='Aug 6 2008, 02:31 PM']Tặng các bác hàm kiểm tra một chuỗi có phải là số hay không

(DEFUN IsNumeric (str )
(if (member (type (read str)) '(REAL INT) )
T
nil
)
)

  • 0

#948 ph168xd

ph168xd

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 779 Bài viết
Điểm đánh giá: 309 (khá)

Đã gửi 06 August 2008 - 08:16 PM

Xin lish insert block đối tượng tự động scale theo tỷ lệ dim hiện hành
VD. Đang sử dung dim với tỷ lệ 50
Insert block "cot", Block tự scale từ tỷ lệ 100 xuống 50
Thanks các Bac nhiều

Bác Gia_Bach nói vậy thì khác nào chỉ sử dụng đc cho mỗi block cột
Lish sẽ scale tất cả các block insert theo ẻy lệ dim.
Mog các Bác giúp

Hy vọng là đúng ý bạn.
(command "insert" "cot" (getpoint "\nDiem dat :") (getvar "dimscale") "" (getangle "\nGoc xoay :"))


  • 0

#949 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 06 August 2008 - 08:35 PM

Xin lish insert block đối tượng tự động scale theo tỷ lệ dim hiện hành
VD. Đang sử dung dim với tỷ lệ 50
Insert block "cot", Block tự scale từ tỷ lệ 100 xuống 50
Thanks các Bac nhiều

Bác Gia_Bach nói vậy thì khác nào chỉ sử dụng đc cho mỗi block cột
Lish sẽ scale tất cả các block insert theo ẻy lệ dim.
Mog các Bác giúp

Bạn dùng lệnh SB trong bộ ACV 1.0
  • 0

#950 traitimsat034

traitimsat034

    biết vẽ pline

  • Members
  • PipPip
  • 61 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 06 August 2008 - 10:00 PM

Anh làm ơn viết giúp em một lisp có chức năng gán giá trị của text cho elevation của pline.
cú pháp lệnh: gõ tên lệnh chương trình yêu cầu chọn text sau đó yêu cầu chọn pline cần gán text vào elevation.
(nếu có thể gán được 1 text cho nhiều pline thì càng tốt)
em cám ơn anh nhiều!
  • 0

#951 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 06 August 2008 - 11:02 PM

Anh làm ơn viết giúp em một lisp có chức năng gán giá trị của text cho elevation của pline.
cú pháp lệnh: gõ tên lệnh chương trình yêu cầu chọn text sau đó yêu cầu chọn pline cần gán text vào elevation.
(nếu có thể gán được 1 text cho nhiều pline thì càng tốt)
em cám ơn anh nhiều!

lệnh là T2H (text to H)
(defun c:t2h()
(setq ent (car (entsel "\nChon text cao do: ")))
(redraw ent 3)
(princ "\nchon cac pline: ")
(setq
ss (ssget '((0 . "LWPOLYLINE")))
new (cons 38 (atof (cdr (assoc 1 (entget ent)))))
i 0
)
(redraw ent 4)
(repeat (sslength ss)
(setq
x (ssname ss i)
i (1+ i)
)
(entmod (subst new (assoc 38 (setq tt (entget x))) tt))
)
(princ)
)

  • 0

#952 traitimsat034

traitimsat034

    biết vẽ pline

  • Members
  • PipPip
  • 61 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 06 August 2008 - 11:44 PM

lệnh là T2H (text to H)

(defun c:t2h()
(setq ent (car (entsel "\nChon text cao do: ")))
(redraw ent 3)
(princ "\nchon cac pline: ")
(setq
ss (ssget '((0 . "LWPOLYLINE")))
new (cons 38 (atof (cdr (assoc 1 (entget ent)))))
i 0
)
(redraw ent 4)
(repeat (sslength ss)
(setq
x (ssname ss i)
i (1+ i)
)
(entmod (subst new (assoc 38 (setq tt (entget x))) tt))
)
(princ)
)

Lisp chạy tốt lắm, cám ơn anh nhiều!
  • 0

#953 meohoang

meohoang

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 811 Bài viết
Điểm đánh giá: 342 (khá)

Đã gửi 07 August 2008 - 12:00 PM

Tại sao nhỉ?

Khẳng định với bạn 2 điều:
- Không thể tối ưu lisp đó được nữa vì nó đã quá tối ưu.
- Lisp này dành để chọn một loạt đối tượng chứ không phải chọn theo cặp.

Tôi cũng đã test, mọi người dùng cũng không sao.

Có 2 khả năng:
1. Mật độ điểm của bạn quá lớn, khoảng cách các điểm quá bé so với kích thước text.
2. Text của bạn Justify không phải là Left.

Bạn có thể upload file của bạn lên diễn đàn được không?

Trích dẫn(vbao @ Aug 15 2007, 02:26 PM)
cảm ơn anh Hoành, anh cho tôi hỏi thêm: chương trình chỉ cho chọn từng cặp đối tượng (text +point) một, nếu chọn nhiều cặp đối tượng tôi gặp lỗi khi move xảy ra tình trạng vị trí text 1 sẽ hoán đổi cho vị trí text 2

Bạn Hoành xem lại giúp tôi chạy bị y như bạn Vbao nêu ra.
Đây là file bản vẽ: điểm có cao độ khác với giá trị ghi trên text (EXP: t=6.01 trong khi cao độ z=3.23)
http://www.cadviet.c...s/MTPtest_1.dwg
  • 0

#954 makhongbietnoi

makhongbietnoi

    biết vẽ point

  • Members
  • PipPip
  • 95 Bài viết
Điểm đánh giá: 21 (tàm tạm)

Đã gửi 07 August 2008 - 02:58 PM

Tôi cũng đã tìm chủ đề về Wipeout trên diễn đàn nhưng chưa được như mong muốn.
Tôi muốn biến 1 đường tròn thành 1 Wipeout. Thực ra, đường tròn cũng tạo bởi các đoạn thẳng, nên có thể chia nó ra thành nhiều đoạn thẳng nhỏ, sau đó Join chúng lại thành 1 Pline kín và dùng lệnh Wipeout. Độ mịn của đường tròn lúc đó sẽ phụ thuộc vào số khoảng chia mà ta chọn.
Như vậy Lisp sẽ yêu cầu chọn đối tượng là đường tròn cần chuyển. Chọn số khoảng chia.và sau đó thực hiện.
Mong các bác giúp đỡ!
  • 0

#955 meohoang

meohoang

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 811 Bài viết
Điểm đánh giá: 342 (khá)

Đã gửi 07 August 2008 - 08:24 PM

Tôi cũng đã tìm chủ đề về Wipeout trên diễn đàn nhưng chưa được như mong muốn.
Tôi muốn biến 1 đường tròn thành 1 Wipeout. Thực ra, đường tròn cũng tạo bởi các đoạn thẳng, nên có thể chia nó ra thành nhiều đoạn thẳng nhỏ, sau đó Join chúng lại thành 1 Pline kín và dùng lệnh Wipeout. Độ mịn của đường tròn lúc đó sẽ phụ thuộc vào số khoảng chia mà ta chọn.
Như vậy Lisp sẽ yêu cầu chọn đối tượng là đường tròn cần chuyển. Chọn số khoảng chia.và sau đó thực hiện.
Mong các bác giúp đỡ!

Theo tôi bạn ko cần tìm lisp!
Bạn dùng lệnh _polygon ; dòng nhắc :Enter number of sides <4>: 400(số nguyên này là tuỳ bạn nhập vào, nhấn enter.
dòng nhắc tiếp theo : Enter an option [Inscribed in circle/Circumscribed about circle] <I>: C (chọn C cho đa giác nằm ngoài vòng tròn)
Thế là bạn có 1 pline ; kế tiếp dùng lệnh wipeout mà bạn đã biết.
Bạn xem hình minh hoạ bên dưới

Hình đã gửi
  • 0

#956 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 07 August 2008 - 09:30 PM

Trích dẫn(vbao @ Aug 15 2007, 02:26 PM)
cảm ơn anh Hoành, anh cho tôi hỏi thêm: chương trình chỉ cho chọn từng cặp đối tượng (text +point) một, nếu chọn nhiều cặp đối tượng tôi gặp lỗi khi move xảy ra tình trạng vị trí text 1 sẽ hoán đổi cho vị trí text 2

Bạn Hoành xem lại giúp tôi chạy bị y như bạn Vbao nêu ra.
Đây là file bản vẽ: điểm có cao độ khác với giá trị ghi trên text (EXP: t=6.01 trong khi cao độ z=3.23)
MTPtest_1.dwg

Xin lỗi và cảm ơn bạn đã phát hiện ra lỗi của lisp. Quả thật ban đầu tôi nhầm với lisp khác.

Bạn hãy quay lại mục move text với dấu chấm thập phân để download lại. Tôi đã sửa bài viết của tôi ở đó.
  • 0

#957 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 07 August 2008 - 09:34 PM

Tôi cũng đã tìm chủ đề về Wipeout trên diễn đàn nhưng chưa được như mong muốn.
Tôi muốn biến 1 đường tròn thành 1 Wipeout. Thực ra, đường tròn cũng tạo bởi các đoạn thẳng, nên có thể chia nó ra thành nhiều đoạn thẳng nhỏ, sau đó Join chúng lại thành 1 Pline kín và dùng lệnh Wipeout. Độ mịn của đường tròn lúc đó sẽ phụ thuộc vào số khoảng chia mà ta chọn.
Như vậy Lisp sẽ yêu cầu chọn đối tượng là đường tròn cần chuyển. Chọn số khoảng chia.và sau đó thực hiện.
Mong các bác giúp đỡ!

Bạn dùng lệnh Pol với number of size lớn một chút (khoảng 20-30) để vẽ 'đường tròn'. Đỡ phải load lisp.
  • 0

#958 ph168xd

ph168xd

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 779 Bài viết
Điểm đánh giá: 309 (khá)

Đã gửi 07 August 2008 - 10:03 PM

Bạn dùng lệnh SB trong bộ ACV 1.0


Em cũng đã từng biết ACV 1.0.
Nhưng chỉ khi chèn block rồi mới sử dụng đc lish a. Hoành ah
Em muốn có 1 lish khi nhập lệnh insert, block tự scale theo tỷ lệ dim hiện hành
Mong anh giúp em!
  • 0

#959 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 07 August 2008 - 10:32 PM

Em cũng đã từng biết ACV 1.0.
Nhưng chỉ khi chèn block rồi mới sử dụng đc lish a. Hoành ah
Em muốn có 1 lish khi nhập lệnh insert, block tự scale theo tỷ lệ dim hiện hành
Mong anh giúp em!

Bạn thử lisp của gia_bach chưa?

Hy vọng là đúng ý bạn.
(command "insert" "cot" (getpoint "\nDiem dat :") (getvar "dimscale") "" (getangle "\nGoc xoay :"))


  • 0

#960 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 08 August 2008 - 07:34 AM

Tôi cũng đã tìm chủ đề về Wipeout trên diễn đàn nhưng chưa được như mong muốn.
Tôi muốn biến 1 đường tròn thành 1 Wipeout. Thực ra, đường tròn cũng tạo bởi các đoạn thẳng, nên có thể chia nó ra thành nhiều đoạn thẳng nhỏ, sau đó Join chúng lại thành 1 Pline kín và dùng lệnh Wipeout. Độ mịn của đường tròn lúc đó sẽ phụ thuộc vào số khoảng chia mà ta chọn.
Như vậy Lisp sẽ yêu cầu chọn đối tượng là đường tròn cần chuyển. Chọn số khoảng chia.và sau đó thực hiện.
Mong các bác giúp đỡ!

Thường tôi dùng cách như của meohoang và cũng đã đề cập ở các bài về Wipeout trước rồi nhưng nếu bạn thíc dùng lisp thì đây:

(Defun c:wipc ()
(setq luubatdiem (getvar "osmode"))
(setvar "osmode" 0)

(Princ "\nHay chon CIRCLE :")
(setq XX (ssget '((0 . "CIRCLE"))))

(setq L 0)
(setq M (sslength XX))
(while (< L M)
(setq DT (ssname XX L))
(setq DT (entget DT))
(setq TAM (cdr (assoc 10 DT)))
(setq BANKINH (cdr (assoc 40 DT)))

(command ".polygon" "30" TAM "" BANKINH)
(command ".wipeout" "" "last" "y")

(setq L (1+ L))
)

(setvar "osmode" luubatdiem)

(setvar "MODEMACRO" "**CHUC BAN LAM VIEC HIEU QUA** PHAM QUOC DUY - BINH SON - QUANG NGAI")
(Princ)
)


Gỏ lệnh : wipc
Chọn các hình tròn cần tạo (nhiều hình 1 lúc cumh4 được).
Enter là xong. Mặc định đa giác tạo ra có 30 cạnh.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D