Đến nội dung


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

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)


  • Please log in to reply
2848 replies to this topic

#121 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 23 June 2008 - 04:58 PM

Bác Hoanh ơi! Nếu như em muốn gán lần lượt A, B, C, D cho các số thực nhập vào từ bàn phím bằng cách duyệt từng phần tử thì em phải dùng lisp như thế nào? Kính mong bác chỉ giáo giúp.
Thanks bác nhiều!

bạn muốn gán biến A, B, C, D, CADViet cho các số nhập từ bàn phím, bạn làm như sau:
(foreach N (list "A" "B" "C" "D" "C" "CADViet") (set (read N) (getreal (strcat "\nValue of " N ":"))))

Như vậy, biến a sẽ mang giá trị nhập vào đầu tiên, biến b mang giá trị nhập vào thứ 2,... biến cadviet sẽ mang giá trị nhập vào cuối cùng.
  • 2

#122 tulipden87

tulipden87

    biết vẽ line

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

Đã gửi 24 June 2008 - 12:11 AM

bạn muốn gán biến A, B, C, D, CADViet cho các số nhập từ bàn phím, bạn làm như sau:
(foreach N (list "A" "B" "C" "D" "C" "CADViet") (set (read N) (getreal (strcat "\nValue of " N ":"))))

Như vậy, biến a sẽ mang giá trị nhập vào đầu tiên, biến b mang giá trị nhập vào thứ 2,... biến cadviet sẽ mang giá trị nhập vào cuối cùng.

Em cảm ơn bác Hoanh nhiều. Em lại không nghĩ đến dùng hàm Read. Mong được bác chỉ giáo nhiều về sau!
  • 0

#123 haimeadi

haimeadi

    biết pan

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

Đã gửi 21 July 2008 - 03:57 PM

Cám ơn! Vậy là không có cách nào gọi lệnh bhatch từ mã lisp sao?

có đây:
(defun c:gv ()
(setvar "hpname" "BTGV-01")
(setvar "hpscale" 50)
(command "bhatch" )
);
  • 0

#124 haimeadi

haimeadi

    biết pan

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

Đã gửi 21 July 2008 - 04:03 PM

Cám ơn! Vậy là không có cách nào gọi lệnh bhatch từ mã lisp sao?

Có đây bạn dùng thử xem:
(defun c:gv ()
(setvar "hpname" "BTGV-01")
(setvar "hpscale" 50)
(command "bhatch" )
);
http://www.cadviet.c...enh_Hatch_1.lsp
  • 0

#125 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 21 July 2008 - 04:12 PM

Có đây bạn dùng thử xem:
(defun c:gv ()
(setvar "hpname" "BTGV-01")
(setvar "hpscale" 50)
(command "bhatch" )
);
http://www.cadviet.c...enh_Hatch_1.lsp

Bạn này không hiểu ý mình rồi. Gọi lệnh bhatch nghĩa là phải lên được hộp thoại kia. Làm kiểu này không lên được đâu.
Cám ơn !!
  • 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


#126 haimeadi

haimeadi

    biết pan

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

Đã gửi 21 July 2008 - 04:43 PM

Bạn này không hiểu ý mình rồi. Gọi lệnh bhatch nghĩa là phải lên được hộp thoại kia. Làm kiểu này không lên được đâu.
Cám ơn !!

Bạn thường dùng hpname là gì và biết tỉ lệ hpscale thì dùng lệnh tắt hay hơn là gọi lên hộp thoại chứ
Tôi thường dùng tô vùng nếu là gạch vỡ thì đánh lệnh là gv, còn bê tông là bt nhanh lắm đỡ mất công chọn tỉ lệ
  • 0

#127 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 21 July 2008 - 04:50 PM

Bạn thường dùng hpname là gì và biết tỉ lệ hpscale thì dùng lệnh tắt hay hơn là gọi lên hộp thoại chứ
Tôi thường dùng tô vùng nếu là gạch vỡ thì đánh lệnh là gv, còn bê tông là bt nhanh lắm đỡ mất công chọn tỉ lệ

Cái gì cũng có nguyên nhân của nó cả bạn à.
Cơ quan mình dùng cadr14. Mình viết nguyên bộ lisp cho cơ quan dùng trong đó có hatch mở rộng. Ngặt cái là cadr14 không Hiển thị được các sld của hatch mở rộng như cad đời mới khó cho người khác sử dụng.
Lúc trước mình dùng imagemenu cho việc này nhưng nay không muốn nên mới vướng vần đề trên.
Bây giờ mình ghét cái mặt quá nên viết lại 1 cái hộp thoại mới ken cho việc này lun.
Vấn đề là như vậy bạn ạ !!
  • 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


#128 PhucQuan

PhucQuan

    biết zoom

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

Đã gửi 13 August 2008 - 01:16 AM

Các bác cho em hỏi, có biến hệ thống nào lưu giữ bán kính bo tòn khi ta vẽ một hình chữ nhật không?
  • 0

#129 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 13 August 2008 - 08:17 AM

Các bác cho em hỏi, có biến hệ thống nào lưu giữ bán kính bo tòn khi ta vẽ một hình chữ nhật không?


biến CIRCLERAD lưu bán kính hình tròn khi vẽ hình tròn.
biến FILLETRAD lưu bán kính khi ta dùng lệnh fillet.

Không có lệnh nào vẽ một hình chữ nhật bo tròn góc, nên không có biến nào lưu cả.
  • 1

#130 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 13 August 2008 - 09:15 AM

biến CIRCLERAD lưu bán kính hình tròn khi vẽ hình tròn.
biến FILLETRAD lưu bán kính khi ta dùng lệnh fillet.

Không có lệnh nào vẽ một hình chữ nhật bo tròn góc, nên không có biến nào lưu cả.


Command: rec RECTANGLE
Chamfer/Elevation/Fillet/Thickness/Width/<First corner>: f

Fillet radius for rectangles <500.0000>: 200

Chamfer/Elevation/Fillet/Thickness/Width/<First corner>:
Other corner:

Có đây bác nguyenhoanh nhưng cái này không trùng giá trị với FILLETRAD còn nó là cái gì thì mình cũng chịu !!
  • 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


#131 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 13 August 2008 - 12:17 PM

Command: rec RECTANGLE
Chamfer/Elevation/Fillet/Thickness/Width/: f

Fillet radius for rectangles <500.0000>: 200

Chamfer/Elevation/Fillet/Thickness/Width/:
Other corner:

Có đây bác nguyenhoanh nhưng cái này không trùng giá trị với FILLETRAD còn nó là cái gì thì mình cũng chịu !!

Cảm ơn bạn đã chỉ ra, đúng là từ trước đến giờ không để ý đến chức năng này của lệnh rectangle.
  • 0

#132 tien2005

tien2005

    biết lệnh properties

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

Đã gửi 14 August 2008 - 10:43 PM

Mình có 2 vấn đề nhờ các Bạn giải đáp:

Thứ 1: mình có 1 SUB hay 1 FUNCTION viết bằng VBA, ví dụ

Public b As String
Sub test()
b = "giatritimduoc"
End sub

Thì trong lisp làm cách nào để lấy được giá trị của b. Và tương tự trong VBA làm sao lấy được các giá trị được tính toán trong Lisp

Thứ 2: mình có 1 file *.txt có nội dung như sau:

1 300.2
2 500.5
a2 600.6

Trong lisp mình có thể đọc và ghi các giá trị đó lên bản vẽ bằng lệnh TEXT. Riêng giá trị a2 (không phải là số, dùng hàm TYPE thì nhận được nó là loại SYMBOL) thì không thể ghi được. Muốn ghi giá trị a2 thì phải làm như thế nào

Thanks
  • 0

#133 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 14 August 2008 - 11:10 PM

Mình có 2 vấn đề nhờ các Bạn giải đáp:

Thứ 1: mình có 1 SUB hay 1 FUNCTION viết bằng VBA, ví dụ

Public b As String
Sub test()
b = "giatritimduoc"
End sub

Thì trong lisp làm cách nào để lấy được giá trị của b. Và tương tự trong VBA làm sao lấy được các giá trị được tính toán trong Lisp

Thứ 2: mình có 1 file *.txt có nội dung như sau:

1 300.2
2 500.5
a2 600.6

Trong lisp mình có thể đọc và ghi các giá trị đó lên bản vẽ bằng lệnh TEXT. Riêng giá trị a2 (không phải là số, dùng hàm TYPE thì nhận được nó là loại SYMBOL) thì không thể ghi được. Muốn ghi giá trị a2 thì phải làm như thế nào

Thanks

Thứ 2: Vấn đề này khá thú vị, bạn xem đoạn mã lisp sau.
(setq str "a2 600.6"; giá trị ban đầu của bạn
str (strcat "(setq " str ")"); bây giờ biến str mang giá trị "(setq a2 600.6)"
)
(eval (read str)); thực hiện đoạn mã lisp có nội dung str
(alert (rtos a2)); hiện thị kết quả a2 = 600.6 là kết quả của lệnh (setq a2 600.6)
Với đoạn mã trên, tôi đã thực hiện phép gán a2 bằng 600.6 bằng kỹ thuật execute một dòng string.
  • 0

#134 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 14 August 2008 - 11:22 PM

Ở vấn đề thứ 2:
Hình như Bác Hoành chưa hiểu ý của tien2005.

To tien2005:
Để đơn giản code trong lisp với vấn đề trên thì file txt nên là
(chú ý cặp dấu "):

1 300.2
2 500.5
"a2" 600.6
  • 0

#135 tien2005

tien2005

    biết lệnh properties

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

Đã gửi 22 August 2008 - 11:59 PM

@Nguyen Hoanh: Thanks, mình lại biết thêm được 1 hàm :s_big:
@Nô Thiên: Thanks, cách của Bạn cũng rất hay, nhưng chỉ cục bộ cho vài giá trị. Nếu cho cả fiel thì làm bằng tay cũng vất vả, mình cũng thử: (setq str ( strcat (chr 34) str (chr 34))) để cho các giá trị trong fiel luôn nằm trong cặp dấu " cũng chưa được. Lạđầnh sống chung với lũ :s_big:

Vấn đề mới:
trong vòng While đọc và xử lý các số liệu trong file *.txt. Nếu cuối file *.txt có nhiều hơn 1 hàng trống thì LISP sẽ bị lỗi. mình đã tìm cách bẩy lỗi này bằng cách so sánh với ký tự enter "\n" hay giá trị NIL nhưng không thành công

Vậy trong trờng hợp này chúng ta sẽ dùng đọan LISP nào để phát hiện ra các hàng trống này (các Bạn đừng nói mình xóa các hàng trống này trên file *.txt nha). Mục đích là sau vòng while này chúng ta sẽ còn xử lý thêm các lệnh khác
Thanks

ec, sau khi xem thử bài viết thì nó ra mã unicode thì khó sửa lại bài viết quá admin ơi
  • 0

#136 Jin Yong

Jin Yong

    biết lệnh group

  • Vip
  • PipPipPipPipPipPip
  • 498 Bài viết
Điểm đánh giá: 334 (khá)

Đã gửi 23 August 2008 - 07:58 AM

Mình có 2 vấn đề nhờ các Bạn giải đáp:

Thứ 1: mình có 1 SUB hay 1 FUNCTION viết bằng VBA, ví dụ

Public b As String
Sub test()
b = "giatritimduoc"
End sub

Thì trong lisp làm cách nào để lấy được giá trị của b. Và tương tự trong VBA làm sao lấy được các giá trị được tính toán trong Lisp

Jin có một giải pháp cho vấn đề này là truyền dữ liệu (ghi giá trị của b="...") ra một file trung gian. Sau đó trong đoạn mã viết bằng ngôn ngữ khác ta lại đọc file trung gian để lấy giá trị này.
  • 0

Phát triển phần mềm thiết kế Kết cấu Việt Nam - http://www.ketcausoft.com


#137 tien2005

tien2005

    biết lệnh properties

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

Đã gửi 23 August 2008 - 10:09 AM

Jin có một giải pháp cho vấn đề này là truyền dữ liệu (ghi giá trị của b="...") ra một file trung gian. Sau đó trong đoạn mã viết bằng ngôn ngữ khác ta lại đọc file trung gian để lấy giá trị này.


Cám ơn Jing đã trả lời, cách của Jing rất tổng quát và thích hợp cho nhiều ngôn ngữ. Mình thì xử lý bằng cách ghi giá trị của b dạng text ra bản vẽ tại 1 vị trí bất kỳ nào đó (chỉ dùng trong autocad thôi :s_big: ), sau đó dùng lisp đọc giá trị này, sau khi đọc xong thì xóa cái text này

Ngoài các cách trên không biết còn cách nào lấy trực tiếp giá trị của b trong bộ nhớ của máy tính mà không cần qua bước trung gian nào khác không
  • 0

#138 Snowman

Snowman

    biết lệnh mirror

  • Members
  • PipPipPip
  • 155 Bài viết
Điểm đánh giá: 90 (tàm tạm)

Đã gửi 23 August 2008 - 08:42 PM

Cám ơn Jing đã trả lời, cách của Jing rất tổng quát và thích hợp cho nhiều ngôn ngữ. Mình thì xử lý bằng cách ghi giá trị của b dạng text ra bản vẽ tại 1 vị trí bất kỳ nào đó (chỉ dùng trong autocad thôi :s_big: ), sau đó dùng lisp đọc giá trị này, sau khi đọc xong thì xóa cái text này

Ngoài các cách trên không biết còn cách nào lấy trực tiếp giá trị của b trong bộ nhớ của máy tính mà không cần qua bước trung gian nào khác không

Bác nào hiểu biết về clipboard trong Win thì giới thiệu cho anh em với!
Clipboard có thể sử dụng trong hầu hết các ứng dụng chạy trên Win và các loại dữ liệu rất đa dạng. Chẳng hạn có thể copy các giá trị từ CAD qua Word, Excel, và ngược lại
Vậy có cách nào lưu một giá trị (kiểu số, text, thậm chí cả đối tượng CAD) vào trong clipboard (bằng ngôn ngữ lisp hay vba) ?
  • 0

. - ' * ' - .. - ... "Sống trong đời sống cần có một tấm lòng..." . - ' * ' - .. -
-----------------------------------------------------------------------------------

Hình đã gửi Hình đã gửi


#139 Hung_tthanh

Hung_tthanh

    biết pan

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

Đã gửi 09 September 2008 - 06:18 PM

Trong các phần mềm mình thấy có các thứ viện chứa file DWG, vẽ sẳn các hình cần thiết
khi gọi 1 lệnh để thực hiện thì load các hình trong thư viện vào.
Cho mình hỏi làm cách nào để thực hiện được như vậy
  • 0

#140 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 10 September 2008 - 07:35 AM

Trong các phần mềm mình thấy có các thứ viện chứa file DWG, vẽ sẳn các hình cần thiết
khi gọi 1 lệnh để thực hiện thì load các hình trong thư viện vào.
Cho mình hỏi làm cách nào để thực hiện được như vậy

Bạn đã hỏi câu này 2 chổ rồi nhưng câu hỏi của bạn không rỏ:
-Các hình cần thiết: đây là bạn đề cập đến cái gì vậy, ý bạn là file cad hay cái ảnh sld để hiển thị.
-Khi gọi 1 lệnh để thực hiện thì load các hình trong thư viện vào: cái này cũng không hiểu ý nghĩa được.
*Bạn muốn biết cách làm gì:
-Cách tạo file sld từ file cad?
-Cách tạo chương trình thư viện có hình ảnh và từ đó chọn để chèn thư viện vào?
  • 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