Chuyển đến nội dung
Diễn đàn CADViet
ThuyLinh313

[Đã xong] - Lisp Calculator thay thế cho máy tính của CAD

Các bài được khuyến nghị

Thực ra thì ban đầu mình chỉ định viết 1 hàm con xuất kết quả tính toán có tích hợp 1 máy tính để tính toán tiếp với các phép tính đơn giản. Tuy nhiên sau đó được sự trợ giúp của các bạn Tue_NV, KangKung và các ý tưởng của Thaistreetz, mình phát triển nó thành 1 lisp hoàn thiện đủ sức thay thế máy tính dòng lệnh của CAD (lệnh CAL), cung cấp cho người dùng khả năng tính toán linh hoạt, liên tục và trực quan hơn. Các bạn có thể download tại đây.

Trong file lisp các bạn down về có 2 phần:

- Phần 1: Lệnh CAC dùng thay thế cho CAL để tính toán

86046_bbbb.gif

 

 

Phần 2: Hàm con xuất kết quả để các bạn có thể dùng nó để nhúng vào code lisp của các bạn

Cấu trúc: (Calculator-export-Result value) Value: là Interger, Real hoặc nil

86046_aaa.gif

 

Với hàm xuất kết quả này các bạn có thể:

- Tính toán tiếp với giá trị value

- Xuất giá trị value vào text

- Copy giá trị Value vào Clipboard để Paste vào đâu tùy các bạn (Click chuột phải chứ không pick vào text)

- Tùy chọn làm tròn value trước khi xuất (các bạn sử dụng 2 phím ] và [ để làm việc này)

- Khi tính toán, các bạn có thể nhập phép tính trực tiếp từ bàn phím hoặc lấy các giá trị từ các text trên màn hình)

 

PS: Mình sẽ tiếp tục update nếu nhận được các ý tưởng tốt hơn từ các bạn.

 

  • Like 2
  • Vote tăng 12

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ực ra thì ban đầu mình chỉ định viết 1 hàm con xuất kết quả tính toán có tích hợp 1 máy tính để tính toán tiếp với các phép tính đơn giản. Tuy nhiên sau đó được sự trợ giúp của các bạn Tue_NV, KangKung và các ý tưởng của Thaistreetz, mình phát triển nó thành 1 lisp hoàn thiện đủ sức thay thế máy tính dòng lệnh của CAD (lệnh CAL), cung cấp cho người dùng khả năng tính toán linh hoạt, liên tục và trực quan hơn. Các bạn có thể download tại đây.

 

CAC chưa đủ sức thay thế lệnh CAL đâu.  :lol:

Lệnh CAL có thể transparent Command. Còn CAC thì 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

Xét như thế thì vô cùng lắm. Mình có thể viết để transparent được và cũng đã có ý định như thế. nhưng xét đi xét lại, phải thay đổi thuật toán, làm chậm chương trình chỉ vì 1 chức năng ít dùng thì không đáng.

Tương tự, khi viết lisp này đồng nghiệp của mình có ý kiến thêm chức năng ghi kết quả ra màn hình bằng 1 text mới. Đây cũng là chức năng mà mình thấy hầu như không dùng nên không cho vào. khi cần thì có thể kích chuột phải rồi Ctrl+V là xong.

 

Ngược lại, nếu dùng CAC hơn CAL khá nhiều. Đặc biệt là khả năng tính toán với Integer lớn. Cách thức làm việc của nó làm cho khoảng cách giữa tính toán dòng lệnh và tính toán qua giao diện UI (qcal) gần nhau hơn

 

Ở đây mình chỉ xem xét việc thay thế ở khía cạnh tính toán thông thường thô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

Ở đây mình chỉ xem xét việc thay thế ở khía cạnh tính toán thông thường thôi. :)

1). Chấp nhận trích lục này của bạn, bởi CAL nó mênh mông mà nhu cầu chưa đến nỗi thế.

2). Ý tưởng này tốt. Mình vote. Tuy nhiên, để thực hiện ý tưởng cho thấu đáo cũng cần chờ test và comment nữa để hoàn thiện.

3). Tiếc là tất cả lisp của Tue_NV, KK... đều chưa giải quyết hết chuyện cũ >> lisp của bạn bị lỗi theo.

Một VD: 1*exp10(2). Và còn nhiều ví dụ nữ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

3). Tiếc là tất cả lisp của Tue_NV, KK... đều chưa giải quyết hết chuyện cũ >> lisp của bạn bị lỗi theo.

Một VD: 1*exp10(2). Và còn nhiều ví dụ nữa.

 

Còn 1 số lỗi nữa, nhưng mà thôi: Bạn TL đóng gói "fas" nên Tue_NV không có hứng mà chỉnh sửa nữa rồ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

Mình đóng gói fas là vì trong đó có những thứ không phải của mình, không chỉ hàm của bạn viết giùm mình thôi đâu. Mình chỉ có thể chia sẻ code khi tác giả của nó chia sẻ. Từ khi tham gia diễn đàn đến giờ mình cởi mở như thế nào chắc bạn hiểu. Thêm nữa, mình không phải là người đầu tiên mã hóa lisp để chia sẻ. mình thấy nhiều bạn, kể cả mod hay admin nick xanh nick đỏ cũng đã làm như vậy khi cần thiết. Code như thế nào không quan trọng, quan trọng là ý tưởng chia sẻ cho nhau thôi.

@ ĐVH: Mình không quan trọng chuyện vote hay không, nó không có ý nghĩa gì với mình lắm! Nặng nề chuyện đó chỉ khiến mất long nhau. Mình thích các đóng góp ý tưởng hoặc những lời khen-chê hơ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

 ĐVH: Mình không quan trọng chuyện vote hay không, nó không có ý nghĩa gì với mình lắm! Nặng nề chuyện đó chỉ khiến mất long nhau. Mình thích các đóng góp ý tưởng hoặc những lời khen-chê hơn :)

1). Nhưng mình có quyền vote nếu thấy ý tưởng đó đối với mình là tốt chứ nhỉ?

2). Mình nhắc lại một điều này: mình vẫn cho ý tưởng của bạn là tốt. Tuy nhiên, cái cách để chuyển 1 biểu thức cal dạng string thì còn lắm vấn đề, bởi các lisp mà bạn đang sử dụng để làm dẫn xuất đều chỉ xét tới number hoặc không number mà không hề xét bản chất của 1 biểu thức cal.

3). Do mình không thích phải đi tìm từng cái lắt nhắt (dù rất cần thiết) và có thể sẽ đụng chạm tới người khác nên đành thôi vậy.

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

1). Nhưng mình có quyền vote nếu thấy ý tưởng đó đối với mình là tốt chứ nhỉ?

2). Mình nhắc lại một điều này: mình vẫn cho ý tưởng của bạn là tốt. Tuy nhiên, cái cách để chuyển 1 biểu thức cal dạng string thì còn lắm vấn đề, bởi các lisp mà bạn đang sử dụng để làm dẫn xuất đều chỉ xét tới number hoặc không number mà không hề xét bản chất của 1 biểu thức cal.

3). Do mình không thích phải đi tìm từng cái lắt nhắt (dù rất cần thiết) và có thể sẽ đụng chạm tới người khác nên đành thôi vậy.

 

Tue_NV xét rồi đây bác, code này hồi âm bài viết của bạn TL. Cảm ơn bạn đã chia sẻ

Thử : (Cal(Tue-int-real "exp10(2)")) -> 100.0

(Cal(Tue-int-real "d2r(180)")) ->  3.14159

 

@bác DVH: Bác tìm lỗi thử. Có gì mà ngại bác. Bác tìm ra lỗi thì Tue_NV còn tick Thanks và cảm ơn bác nữa ấy chứ.

 
(defun Tue-int-real(str / str-res str2)
;;;write by Tue_NV
  ;;;;;example: (Tue-int-real "a2b3.1c5") -> "a2.0b3.1c5.0"
  ;;;;;(Tue-int-real "aa2222b3.1c56") -> "aa2222.0b3.1c56.0"
  ;;;;;(Tue-int-real "sqrt(5E10+6E9)") -> "sqrt(50000000000.0+6000000000.0)"
 (vl-load-com) (setvar "dimzin" 0)
(setq str-res "" str2 str)
  (while (/= (strlen str2) 0)
    (if (wcmatch (strcase (substr str2 1 5)) "EXP10*")
      (setq str2 (vl-string-left-trim "ABCDEFGHIKLMNOPQRSTUYZXY+-*/%( ),#@$^!~_&^\\" (strcase (substr str2 6 (strlen str2)))))
      (if (wcmatch (strcase (substr str2 1 3)) "D2R*,R2D*")
(setq str2 (vl-string-left-trim "ABCDEFGHIKLMNOPQRSTUYZXY+-*/%( ),#@$^!~_&^\\" (strcase (substr str2 4 (strlen str2)))))
        (setq str2 (vl-string-left-trim "ABCDEFGHIKLMNOPQRSTUYZXY+-*/%( ),#@$^!~_&^\\"  (strcase str2)))))
    (if (/= (strlen str2) 0) 
(setq str-res (strcat str-res (substr str 1 (- (strlen str) (strlen str2))) (vl-string-right-trim "0" (rtos (atof str2) 2 9))))
(setq str-res (strcat str-res (substr str 1 (- (strlen str) (strlen str2))) ))
    )
    (if (= (substr str-res (strlen str-res) 1) ".") (setq str-res (strcat str-res "0")))
    (setq str2 (vl-string-left-trim "E1234567890 ."  str2)
 str (substr str (1+ (- (strlen str) (strlen str2))) (strlen str))
    )
  )
str-res
  )
  • 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

Lại "gan" giống KK bữa trước! Đùa vui thôi nhé, chứ không có ý xấu đâu.

Còn tỉ tỉ ví dụ (nói đùa như người QN-ĐN ấy mà):

VD2: 5d5'5"

  • 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

Lại "gan" giống KK bữa trước! Đùa vui thôi nhé, chứ không có ý xấu đâu.

Còn tỉ tỉ ví dụ (nói đùa như người QN-ĐN ấy mà):

VD2: 5d5'5"

 

Chắc chỉ còn 1 TH độ phút giây nữa thôi bác ơi!. 

Có đâu mà tỉ tỉ... có một, có một mới đúng  :D 

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 DVH: Bác tìm lỗi thử. Có gì mà ngại bác. Bác tìm ra lỗi thì Tue_NV còn tick Thanks và cảm ơn bác nữa ấy chứ.

Em chả thấy mấy đâ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

Tue_NV xét rồi đây bác, code này hồi âm bài viết của bạn TL. Cảm ơn bạn đã chia sẻ

Thử : (Cal(Tue-int-real "exp10(2)")) -> 100.0

(Cal(Tue-int-real "d2r(180)")) ->  3.14159

Khi sử dụng code của bạn mình thấy có trường hợp này gây lỗi nghiêm trọng không thoát được khỏi vòng lặp while:

Nếu chuỗi gốc sau khi Upcase tồn tại các ký tự đặc biệt không nằm trong dãy ký tự "ABCDEFGHIKLMNOPQRSTUYZXY+-*/%( );^\\" và "E1234567890 ". Vì thế mình đã sửa nó đi một chút bằng cách thêm 1 bước kiểm tra chiều dài str2 có thay đổi không sau 1 vòng lặp.

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

@ Chị ThuyLinh dùng cách nào để quay lại màn hình lúc thực hiện lệnh hay vậy? Cách trình bày của chị thật trực quan!

Đối với lệnh phần 2, sau khi lấy chiều dài của nhóm đối tượng để tính toán và gán kết quả vào một text có sẵn, nếu muốn trong quá trình tính toán lại tham chiếu tới một "tổng chiều dài" của một nhóm đối tượng khác nữa thì làm cách nào hả chị? 

  • 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

Mình dùng phần mềm GifCam để quay Song Nhi ạ. Phần mềm này nhẹ, chỉ có 1 file exe thôi, sử dụng lại rất dễ dàng đơn giản.

Lệnh phần 2: Mình cần phải lưu ý: lệnh TCD là 1 ứng dụng khác của mình. Trong trường hợp này mình dùng nó chỉ để minh họa cách sử dụng hàm Calculator-export-Result chứ không phải là mình đang chia sẻ lệnh TCD. phần này không có ý nghĩa gì với người sử dụng cad. Nó chỉ có ý nghĩa với các bạn lập trình Lisp thui.

 

Sau khi lấy chiều dài của nhóm đối tượng để tính toán và gán kết quả vào một text có sẵn, nếu muốn trong quá trình tính toán lại tham chiếu tới một "tổng chiều dài" của một nhóm đối tượng khác nữa thì làm cách nào hả chị? 

Hiện tại thì lisp trên chưa hỗ trợ, nhưng ý tưởng này rất hay! mình rất thích! Mãi mới thấy có 1 ý tưởng tốt hơn cho Lisp này. Mình sẽ update chức năng này trong bài sau. Cảm ơn Nhi 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

Hiện tại thì lisp trên chưa hỗ trợ, nhưng ý tưởng này rất hay! mình rất thích! Mãi mới thấy có 1 ý tưởng tốt hơn cho Lisp này. Mình sẽ update chức năng này trong bài sau. Cảm ơn Nhi nha!

ban đầu nghe thì thấy có vẻ thừa vì cal có sẵn rồi tội gì nữa nhưng sau khi xem thì thấy nó tiện quá cả text cả nhập đều được nên chơi luôn

mình chưa biết là đã có bài sau chưa bạn nhỉ

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

ThuyLinh313 có thể cải tiến thêm 1 chút các yêu cầu sau được không:

- Lấy kết quả từ dim để tính toán.

- Thêm con trỏ (dấu nháy - cursor) để biết vị trí và di chuyển được bằng phím mũi tên.

102896_dim_calc.gif

 

ps: Sao mình không dùng được lệnh tcd nhỉ?

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

@Chiron: Lâu rồi mình không vào cadviet nên quên mất lời hứa update. :)

Lisp này mình đã update lên 1 số phiên bản, sửa lỗi đồng thời thêm một số chức năng. Tuy nhiên hiện tại việc tách nó ra khỏi project của mình mất tương đối nhiều thời gian do các lien kết hàm con trong project. Hẹn bạn khi nào có thời gian rảnh mình sẽ up.

 

Về việc sử dụng con trỏ được điều khiên bằng các phím điều hướng thì mình e là không làm được, do lisp không hỗ trợ nhận diện sự kiện các nút điều hướng bị nhấn. mình từng làm 1 phiên bản sử dung các phím khác để đi chuyển con trỏ, nhưng quá trình sử dung lại gây ra một số bất tiện nên bỏ.

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

@Chiron: Lâu rồi mình không vào cadviet nên quên mất lời hứa update. :)

Lisp này mình đã update lên 1 số phiên bản, sửa lỗi đồng thời thêm một số chức năng. Tuy nhiên hiện tại việc tách nó ra khỏi project của mình mất tương đối nhiều thời gian do các lien kết hàm con trong project. Hẹn bạn khi nào có thời gian rảnh mình sẽ up.

chờ bài update của bạ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

 

Thực ra thì ban đầu mình chỉ định viết 1 hàm con xuất kết quả tính toán có tích hợp 1 máy tính để tính toán tiếp với các phép tính đơn giản. Tuy nhiên sau đó được sự trợ giúp của các bạn Tue_NV, KangKung và các ý tưởng của Thaistreetz, mình phát triển nó thành 1 lisp hoàn thiện đủ sức thay thế máy tính dòng lệnh của CAD (lệnh CAL), cung cấp cho người dùng khả năng tính toán linh hoạt, liên tục và trực quan hơn. Các bạn có thể download tại đây.

Trong file lisp các bạn down về có 2 phần:

- Phần 1: Lệnh CAC dùng thay thế cho CAL để tính toán

86046_bbbb.gif

 

 

Phần 2: Hàm con xuất kết quả để các bạn có thể dùng nó để nhúng vào code lisp của các bạn

Cấu trúc: (Calculator-export-Result value) Value: là Interger, Real hoặc nil

86046_aaa.gif

 

Với hàm xuất kết quả này các bạn có thể:

- Tính toán tiếp với giá trị value

- Xuất giá trị value vào text

- Copy giá trị Value vào Clipboard để Paste vào đâu tùy các bạn (Click chuột phải chứ không pick vào text)

- Tùy chọn làm tròn value trước khi xuất (các bạn sử dụng 2 phím ] và [ để làm việc này)

- Khi tính toán, các bạn có thể nhập phép tính trực tiếp từ bàn phím hoặc lấy các giá trị từ các text trên màn hình)

 

PS: Mình sẽ tiếp tục update nếu nhận được các ý tưởng tốt hơn từ các bạn.

Lisp này hình như bị xung đột với lisp tính diện tích thì phải. Dùng líp này thì không dùng được lip tdt bạn àh

 

 

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

@ThuyLinh313 bạn Linh ơi rất cảm ơn bạn vì lisd này. Nhưng mình gặp phải một vấn đề là cơ quan mình tính toán lấy tròn 3 chữ số thập phân, mà của bạn chỉ lấy 2 chữ số thập phân bạn có thể sửa lại và gửi cho mình được không. Rất cám ơn bạ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
51 phút trước, minhphuong4294 đã nói:

@ThuyLinh313 bạn Linh ơi rất cảm ơn bạn vì lisd này. Nhưng mình gặp phải một vấn đề là cơ quan mình tính toán lấy tròn 3 chữ số thập phân, mà của bạn chỉ lấy 2 chữ số thập phân bạn có thể sửa lại và gửi cho mình được không. Rất cám ơn bạn :)

Bạn bấm đâu này "[" và dấu "]" để lấy thêm số thập phâ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

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×