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

#1921 minhtu2004

minhtu2004

    biết lệnh chamfer

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

Đã gửi 05 May 2009 - 08:22 AM

-Chào mọi người. Mình có 1 vấn đề nhỏ cần mọi người giúp đỡ.
-Trong lisp hàm nào để lấy được giá trị của Dim vậy.
-VD: có khỏang cách Dim là 3000. Bây giờ mình muốn lấy giá trị 3000 chia cho 1000 rồi lấy kết quả để vào Dim thành 3@1000=<3000>. Mong mọi người giúp đỡ. Đọan code của mình như sau:
(DEFUN C:BU ()
(setq
DIM (entsel "\n Chon kich thuoc dim:")
PT1 (getpoint "\n Chon diem thu nhat:")
PT2 (getpoint "\n Chon diem thu hai:")
BT (getint "\n Buoc @:")
KC (distance PT1 PT2)
KQ (fix (/ KC BT))
)
(command "dim" "newtext" KQ "@" BT "=<>" DIM "")
(command "exit")
(princ)
)
Mình không biết nó sai cho nào ma không lấy kết quả để vào Dim nhờ mọi người giúp đỡ dùm.
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#1922 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 May 2009 - 08:38 AM

-Chào mọi người. Mình có 1 vấn đề nhỏ cần mọi người giúp đỡ.
-Trong lisp hàm nào để lấy được giá trị của Dim vậy.

Bạn tham khảo cái này có thể lấy giá trị dim :
(alert(rtos (cdr(assoc 42 (entget(car(entsel)))))))

Tue_Nv cũng chưa hiểu ý của bạn. Bạn đã có Dim rồi thì pick điểm 1, điểm 2 làm gì nhỉ? Mình nghĩ có lẽ không cần thiết.
  • 1

#1923 minhtu2004

minhtu2004

    biết lệnh chamfer

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

Đã gửi 05 May 2009 - 09:13 AM

(command "dim" "newtext" KQ "@" BT "=<>" DIM "")
(command "exit")
Dòng lệnh dán kết quả vào Dim như vậy đúng vậy bạn Tue_NV. Mình là nó sai và hok biết sửa như thế nào bạn gíup mình nha. Cám ơn bạn nhiều.
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#1924 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 May 2009 - 09:27 AM

(command "dim" "newtext" KQ "@" BT "=<>" DIM "")
(command "exit")
Dòng lệnh dán kết quả vào Dim như vậy đúng vậy bạn Tue_NV. Mình là nó sai và hok biết sửa như thế nào bạn gíup mình nha. Cám ơn bạn nhiều.

Bạn bị sai ở chổ này :
KQ : phải là một biến kí tự chữ (string). Trong đoạn Code trên thì biến KQ là kiểu số thực nên nó bị lỗi
Bạn dùng hàm Rtos để chuyển kiểu số thực sang kiểu string

BT : phải là một biến kí tự chữ (string). Trong đoạn Code trên thì biến BT là kiểu số nguyên nên nó bị lỗi
Bạn dùng hàm itoa để chuyển kiểu số nguyên sang kiểu string

Và ta dùng hàm strcat để nối chuỗi

Mình sửa lại cho bạn này. Bạn xem nhé :
(DEFUN C:BU() 
(setq od (getvar "dimzin"))
(setvar "dimzin" 0)
(setq
DIM (car(entsel "\n Chon kich thuoc dim:"))
ENT (cdr(assoc 42 (entget DIM)))
BT (getint "\n Buoc @:")
thapphan (getint "\n So chu so thap phan :")
entc (/ ENT BT)
)
(command "dimedit" "n" (strcat (itoa BT) "@" (rtos entc 2 thapphan) "= <>") DIM "")
(setvar "dimzin" od)
(princ)
)

có thể sử dụng lệnh dimedit hoặc dòng lệnh (command "dim" "newtext"....
là tuỳ bạn.
Chúc thành công :(
  • 1

#1925 minhtu2004

minhtu2004

    biết lệnh chamfer

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

Đã gửi 05 May 2009 - 10:38 AM

Cám ơn bạn nhiều. Mình sẽ sửa lại 1 chút cho đúng ý mình. Một lần nữa cám ơn và sẽ nhờ bạn giúp vào những lần sau.
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#1926 minhtu2004

minhtu2004

    biết lệnh chamfer

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

Đã gửi 05 May 2009 - 12:00 PM

Đọan code mình sửa lại như sau:
(DEFUN C:BU()
(setq od (getvar "dimzin"))
(setvar "dimzin" 0)
(setq
BT (getint "\n Buoc @:")
TP (getint "\n So thap phan:")
)
(while (setq
DIM (car(entsel "\n Chon kich thuoc dim:"))
ENT (cdr(assoc 42 (entget DIM)))
entc (fix (/ ENT BT))
)
(command "dimedit" "n" (strcat (rtos entc 2 TP) "@" (itoa BT) "=<>") DIM "")
(setvar "dimzin" od)
(princ)
)
)
Chạy ok theo ý mình rồi nhưng còn chỗ "Số thap phan:" mình muốn cho nó lúc nào giá trị cũng =0 mà hok đuợc. Mong giúp đỡ.
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#1927 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 May 2009 - 12:33 PM

Đọan code mình sửa lại như sau:
(DEFUN C:BU()
(setq od (getvar "dimzin"))
(setvar "dimzin" 0)
(setq
BT (getint "\n Buoc @:")
TP (getint "\n So thap phan:")
)
(while (setq
DIM (car(entsel "\n Chon kich thuoc dim:"))
ENT (cdr(assoc 42 (entget DIM)))
entc (fix (/ ENT BT))
)
(command "dimedit" "n" (strcat (rtos entc 2 TP) "@" (itoa BT) "=<>") DIM "")
(setvar "dimzin" od)
(princ)
)
)
Chạy ok theo ý mình rồi nhưng còn chỗ "Số thap phan:" mình muốn cho nó lúc nào giá trị cũng =0 mà hok đuợc. Mong giúp đỡ.

Đơn giản mà. Bạn bỏ dòng này đi TP (getint "\n So thap phan:")

Còn trong dòng này bạn thay chữ TP bằng số 0 là được
(command "dimedit" "n" (strcat (rtos entc 2 TP) "@" (itoa BT) "=<>") DIM "")
Mong rằng bạn hiểu
Nhưng mà cho Tue_NV hỏi tí nhé : bạn dùng hàm while mục đích làm gì thế?
Nếu mục đích là bạn chọn cho được Dim thì bạn đã sai rồi. Vì một khi bạn chọn không trúng dim thì Lisp sẽ báo lỗi và thoát lệnh ngay
  • 1

#1928 minhtu2004

minhtu2004

    biết lệnh chamfer

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

Đã gửi 05 May 2009 - 12:41 PM

nếu như thay =0 hay dùng hàm fix thì đôi lúc phép tính không đúng, do sai số của môi trường vẽ trong cad. Mình đã thử rồi. Còn cách nào khác không vậy bạn.
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#1929 minhtu2004

minhtu2004

    biết lệnh chamfer

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

Đã gửi 05 May 2009 - 12:47 PM

ah, được rồi bạn ơi. Mình xin lỗi nha, còn While mình muốn tạo vòng lặp, đơn giản vậy thôi ah, có gì sai hả bạn.
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#1930 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 May 2009 - 01:12 PM

ah, được rồi bạn ơi. Mình xin lỗi nha, còn While mình muốn tạo vòng lặp, đơn giản vậy thôi ah, có gì sai hả bạn.

Khi dùng hàm (rtos entc 2 0) thì đã đưa về số chữ số thập phân là 0 nên hàm fix là không cần thiết nữa, bạn có thể bỏ hàm fix này được.
Còn bạn sử dụng hàm while mình xin lỗi đã hiểu nhầm ý của bạn. Khi bạn pick trúng đối tượng thì lặp còn nếu pick không trúng đối tượng thì nó sẽ báo lỗi và thoát lệnh ngay. Đó cũng là do ý của người lập trình thôi
  • 1

#1931 minhtu2004

minhtu2004

    biết lệnh chamfer

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

Đã gửi 05 May 2009 - 01:26 PM

Bạn Tue_NV mình mới nghĩ ra ý mới để đọan code của mình hay hơn nhưng do mình mới bắt đầu viết lisp nên còn rất hạn chế, mình nhờ bạn hỗ trợ mình đọan code kiểm tra để lấy số chia hết còn chia dư thì báo lổi và thoát lệnh.
VD: Có đọan Dim là 3000 lấy giá trị 3000 chia cho 1000 thì ok, còn chia cho số khác nếu kết quả ra dư thì báo lỗi và thóat lệnh. Mình nói vậy không biết bạn hiểu ý mình không. Cám ơn bạn nhiều.
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#1932 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 May 2009 - 02:03 PM

Bạn Tue_NV mình mới nghĩ ra ý mới để đọan code của mình hay hơn nhưng do mình mới bắt đầu viết lisp nên còn rất hạn chế, mình nhờ bạn hỗ trợ mình đọan code kiểm tra để lấy số chia hết còn chia dư thì báo lổi và thoát lệnh.
VD: Có đọan Dim là 3000 lấy giá trị 3000 chia cho 1000 thì ok, còn chia cho số khác nếu kết quả ra dư thì báo lỗi và thóat lệnh. Mình nói vậy không biết bạn hiểu ý mình không. Cám ơn bạn nhiều.

Đây bạn:
(DEFUN C:BU()
(setq od (getvar "dimzin"))
(setvar "dimzin" 0)
(setq
BT (getint "\n Buoc @:")
)
(while (setq
DIM (car(entsel "\n Chon kich thuoc dim:"))
ENT (cdr(assoc 42 (entget DIM)))
entc (/ ENT BT)
sodu (- entc (fix entc))
)
(if (= sodu 0)
(command "dimedit" "n" (strcat (rtos entc 2 0) "@" (itoa BT) "=<>") DIM "")
)
(if (/= sodu 0) (alert "\n phep chia co du"))
)
(setvar "dimzin" od)
(princ)

)
Mình xin đính chính : [b]Có đọan Dim là 3000 lấy giá trị 3000 chia cho bước @ (BT) và bước @ là ước số của 3000 thì ok, còn nếu chia cho các số khác mà không phải là ước số của 3000 thì hiện ra bảng thông báo là phép chia có dư và cho phép ta chọn tiếp đối tượng. Như vậy thì hay hơn phải không bạn minh tu?
  • 1

#1933 minhtu2004

minhtu2004

    biết lệnh chamfer

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

Đã gửi 05 May 2009 - 02:50 PM

Hi hi, cám hơn bạn đã hiểu ý của mình. Nhưng có 1 cái lỗi là hàm fix nó cứ báo lỗi mặc dù kích thước Dim vẫn đúng, do sai số của môi trường cad, xóa dim đó dim lại dim mới là hết lỗi, không biết có khắc phục được không vậy bạn.
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#1934 minhtu2004

minhtu2004

    biết lệnh chamfer

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

Đã gửi 05 May 2009 - 02:53 PM

ah, mình sửa hàm fix thành hàm abs thì nó ok, như vậy nó co sai không vậy bạn. Hàm abs cũng không ok rồi bạn ơi.
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#1935 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 05 May 2009 - 03:13 PM

Bạn Tue_NV mình mới nghĩ ra ý mới để đọan code của mình hay hơn nhưng do mình mới bắt đầu viết lisp nên còn rất hạn chế, mình nhờ bạn hỗ trợ mình đọan code kiểm tra để lấy số chia hết còn chia dư thì báo lổi và thoát lệnh.
VD: Có đọan Dim là 3000 lấy giá trị 3000 chia cho 1000 thì ok, còn chia cho số khác nếu kết quả ra dư thì báo lỗi và thóat lệnh. Mình nói vậy không biết bạn hiểu ý mình không. Cám ơn bạn nhiều.

Chào bạn minhtu2004,
Để kiểm tra theo ý của bạn, bạn có thể sử dụng hàm điều kiện if bạn ạ.
Ví dụ:
(if (/= (fix (/ ENT BT)) (/ ENT BT))
(progn
(protmpt "\n Ban da chon sai gia tri chia. Hãy chọn lại ")
(setq BT (getreal "\n Buoc @: "))
)
)
Bạn chú ý là ở đây, lisp không thoát ra mà yêu cầu bạn chọn lại giá trị cho hợp lý. Khi đó vòng lặp While của bạn mới bắt đầu thực hiện.
Hy vọng bạn sẽ hoàn thành ý nguyện của bạn.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1936 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 05 May 2009 - 03:18 PM

ah, mình sửa hàm fix thành hàm abs thì nó ok, như vậy nó co sai không vậy bạn. Hàm abs cũng không ok rồi bạn ơi.

Bạn sửa vậy không được vì hàm Abs trả về giá trị tuyệt đối chứ không phải giá trị nguyên. Hàm fix trả về giá trị phần nguyên của biểu thức nên (fix a) luôn nhỏ hơn hay bằng a bạn ạ.
Do đó giá trị của hàm abs tuy luôn dương nhưng chưa chắc đã nguyên, còn giá trị của hàm fix tuy luôn nguyên mà chưa chắc dương bạn a.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1937 minhtu2004

minhtu2004

    biết lệnh chamfer

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

Đã gửi 05 May 2009 - 03:49 PM

Mình sửa code nhu bạn Thanh Bình thì nó báo lỗi không chạy. Làm theo cách bạn Tue_NV thì chạy Ok rồi nhưng nó bị cái hàm fix nó không ổn định. Có thể thay hàm fix bằng hàm gì hay doan code nào cho thích hợp, mong mọi người giúp đỡ.
(DEFUN C:BU()
(setq od (getvar "dimzin"))
(setvar "dimzin" 0)
(setq
BT (getint "\n Buoc @:")
)
(while (setq
DIM (car(entsel "\n Chon kich thuoc dim:"))
ENT (cdr(assoc 42 (entget DIM)))
entc (/ ENT BT)
(if (/= (fix (/ ENT BT) (ENT BT))
(progn
(protmpt "\n Ban da chon sai gia tri chia. Ha~y cho.n la.i ")
(setq BT (getreal "\n Buoc @: "))
)
(command "dimedit" "n" (strcat (rtos entc 2 0) "@" (itoa BT) "=<>") DIM "")
(setvar "dimzin" od)
(princ)
)
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#1938 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 May 2009 - 03:56 PM

Chào bạn minhtu2004,
Để kiểm tra theo ý của bạn, bạn có thể sử dụng hàm điều kiện if bạn ạ.
Ví dụ:
(if (/= (fix (/ ENT BT)) (/ ENT BT))
(progn
(protmpt "\n Ban da chon sai gia tri chia. Hãy chọn lại ")
(setq BT (getreal "\n Buoc @: "))
)
)
Bạn chú ý là ở đây, lisp không thoát ra mà yêu cầu bạn chọn lại giá trị cho hợp lý. Khi đó vòng lặp While của bạn mới bắt đầu thực hiện.
Hy vọng bạn sẽ hoàn thành ý nguyện của bạn.

Chào bác PhamthanhBinh.
Có lẽ bác chưa hiểu hết ý của bạn minhtu.
Trước khi viết Lisp Tue_NV đã chạy thử và thấy OK tất cả, nhưng không lường trước được sai số.
Ví dụ như bác dim kích thước một đoạn thẳng có kích thước là 2000.001 thì kích thước đó chạy ra kết quả là 2000 đúng không?
và với Lisp của bác như trên thì khi chọn dim 2000.001 sẽ báo lại cái dòng prompt trên. Bạn minhtu không muốn thế. Ý bạn đó là Lisp phải chạy như kích thước 2000 tròn số như bình thường. Đúng không bạn minhTu?
Tue_NV đã viết thêm vào code 1 khoảng sai số cho phép. Hy vọng bạn hài lòng
(DEFUN C:BU()
(setq od (getvar "dimzin"))
(setvar "dimzin" 0)
(setq
BT (getint "\n Buoc @:")
)
(while (setq
DIM (car(entsel "\n Chon kich thuoc dim:"))
ENT (cdr(assoc 42 (entget DIM)))
entc (/ ENT BT)
sodu (- entc (fix entc))
)
(if (/= (equal sodu 0.001 0.01) nil)
(command "dimedit" "n" (strcat (rtos entc 2 0) "@" (itoa BT) "=<>") DIM "")
)
(if (= (equal sodu 0.001 0.01) nil) (alert "\n phep chia co du"))
)
(setvar "dimzin" od)
(princ)

)

  • 1

#1939 minhtu2004

minhtu2004

    biết lệnh chamfer

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

Đã gửi 05 May 2009 - 04:36 PM

Vẫn không được bạn Tue_NV, vì sai số nó nhỏ quá. VD: có dim 9145 khi chỉnh cho hiện những số lẽ phía sau thì nó là 9144.99999958 vì thế cho nên nó báo lỗi. Trường hợp như vậy có sửa được không vậy bạn, hay có cách nào làm tròn giá trị dim không. Hỏi bạn hòai mình ngại quá. Cám ơn bạn.
  • 0

-Nhận thực hiện bản vẽ 3D bằng revit.
-Liên hệ: 01664793290.


#1940 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 May 2009 - 04:37 PM

Vẫn không được bạn Tue_NV, vì sai số nó nhỏ quá. VD: có dim 9145 khi chỉnh cho hiện những số lẽ phía sau thì nó là 9144.99999958 vì thế cho nên nó báo lỗi. Trường hợp như vậy có sửa được không vậy bạn. Hỏi bạn hòai mình ngại quá. Cám ơn bạn.

Upload file đó lên đây đi bạn.
  • 0