Đế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
2854 replies to this topic

#1601 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 18 April 2013 - 03:16 PM

Mình làm lisp như sau:

Để sửa các đối tượng là text, att trong block thuộc tính, giá trị dim.

Nhưng ko biết sai chổ nào mà dim không tài nào sửa được.

Các bác xoi giúp với. Cám ơn!

(defun duy:docgt (/ dchon)
(setq dchon (car (nentselp "\nChon")))
(while
(or
(null dchon)
(and (= (cdr (assoc 1 (entget dchon))) nil)
)
)
(princ "\nDoi tuong khong hop le")
(setq dchon (car (nentselp "\nChon")))
)
dchon)



(defun c:edd (/ doituong noidung suathanh DTMs)
(command "undo" "be")
(setq doituong (duy:docgt))
(setq noidung (cdr (assoc 1 (entget doituong))))
(setq suathanh (lisped noidung))
(setq DTMs (subst (cons 1 suathanh) (assoc 1 (entget doituong)) (entget doituong)))
(entmod DTMs)
(command ".move" doituong "" "_non" (list 0 0 0) "_non" (list 0 0 0))
(command "undo" "end")
(princ)
)

Sai ở đây anh :

Đối tượng dim là đối tượng phức, cấu tạo bởi line dóng, chữ dim

(car (nentselp)) lấy entity đối tượng gốc cấu thành dim đó chứ không phải là entity của dim

Ví dụ : Khi anh pick vào Line của dim thì Lisp hiểu anh đang pick vào Line đó, Pick vào chữ dim thì hiểu là ename chữ của dim

chứ không phải là ename của dim. 

Bởi ename của dim gốc được lấy bởi (entsel)


  • 1

#1602 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 18 April 2013 - 03:29 PM

Nhưng trường hợp ATT trong block thuộc tính thì lại được. Mình dùng nentselp vì nó đọc được gía trị con số hiển thị của dim trong trường hợpdim chưa sửa số.


  • 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


#1603 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 18 April 2013 - 03:47 PM

Mình làm lisp như sau:

Để sửa các đối tượng là text, att trong block thuộc tính, giá trị dim.

Nhưng ko biết sai chổ nào mà dim không tài nào sửa được.

Các bác xoi giúp với. Cám ơn!

(defun duy:docgt (/ dchon)
(setq dchon (car (nentselp "\nChon")))
(while
(or
(null dchon)
(and (= (cdr (assoc 1 (entget dchon))) nil)
)
)
(princ "\nDoi tuong khong hop le")
(setq dchon (car (nentselp "\nChon")))
)
dchon)



(defun c:edd (/ doituong noidung suathanh DTMs)
(command "undo" "be")
(setq doituong (duy:docgt))
(setq noidung (cdr (assoc 1 (entget doituong))))
(setq suathanh (lisped noidung))
(setq DTMs (subst (cons 1 suathanh) (assoc 1 (entget doituong)) (entget doituong)))
(entmod DTMs)
(command ".move" doituong "" "_non" (list 0 0 0) "_non" (list 0 0 0))
(command "undo" "end")
(princ)
)

 

Em Xơi giúp anh đây : (né dùng vl....)  :lol:

 
(defun duy:docgt (/ dchon)
(setq dchon (nentselp "\nChon"))
(if (eq (type (car(last dchon))) 'ENAME) (setq dchon (car (last dchon))) (setq dchon (car dchon)) )
(while
(or
(null dchon)
(and (= (cdr (assoc 1 (entget dchon))) nil)
)
)
(princ "\nDoi tuong khong hop le")
(setq dchon (nentselp "\nChon"))
(if (eq (type (car(last dchon))) 'ENAME) (setq dchon (car (last dchon))) (setq dchon (car dchon)) )
)
dchon
)
;;;;;
(defun c:edd (/ doituong noidung suathanh DTMs)
(command "undo" "be")
(setq doituong (duy:docgt))
(setq noidung (cdr (assoc 1 (entget doituong))))
(setq suathanh (lisped noidung))
(setq DTMs (subst (cons 1 suathanh) (assoc 1 (entget doituong)) (entget doituong)))
(entmod DTMs)
(command ".move" doituong "" "_non" (list 0 0 0) "_non" (list 0 0 0))
(command "undo" "end")
(princ)
)

  • 1

#1604 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 19 April 2013 - 09:39 AM

@Tue_NV: Code chạy tốt rồi bạn ạ. cảm ơn bạn rất nhiều hihi.

Mình đang còn 1 chút chưa rõ ở chỗ này 

(rtos (atof str2) 2 9). Nếu mình thay 9 bằng 1 thì có ảnh hưởng gì không? Vì sao bạn lại chọn con số 9?

@Ketxu: Không phải vì mình lười đâu, tại vì mình đang bận quá mà bứt dứt vì ý tưởng còn dở dang, chưa hoàn thành được nên đành post yêu cầu nhờ các bạn giúp. Một phần vì mình nghĩ hàm này sẽ nhiều bạn cần đến khi sử dụng Cal để tính toán chuỗi.

PS: Các bạn có ai bị lỗi như mình không? Thỉnh thoảng mình bấm nút mũi tên xanh dưới bài viết của các bạn nhưng lúc thì được, lúc thì lại báo lỗi.

You have reached your quota of positive votes for the day

Hay đây là quy định của diễn đàn? và nếu đúng như mình nghĩ thì vì sao phải quy định vậy nhỉ?


  • 0

#1605 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 19 April 2013 - 10:50 AM

Tránh lạm phát vote để nó ý nghĩa hơn


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#1606 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 19 April 2013 - 12:14 PM

@Tue_NV: Code chạy tốt rồi bạn ạ. cảm ơn bạn rất nhiều hihi.

Mình đang còn 1 chút chưa rõ ở chỗ này 

(rtos (atof str2) 2 9). Nếu mình thay 9 bằng 1 thì có ảnh hưởng gì không? Vì sao bạn lại chọn con số 9?

@Ketxu: Không phải vì mình lười đâu, tại vì mình đang bận quá mà bứt dứt vì ý tưởng còn dở dang, chưa hoàn thành được nên đành post yêu cầu nhờ các bạn giúp. Một phần vì mình nghĩ hàm này sẽ nhiều bạn cần đến khi sử dụng Cal để tính toán chuỗi.

PS: Các bạn có ai bị lỗi như mình không? Thỉnh thoảng mình bấm nút mũi tên xanh dưới bài viết của các bạn nhưng lúc thì được, lúc thì lại báo lỗi.

You have reached your quota of positive votes for the day

Hay đây là quy định của diễn đàn? và nếu đúng như mình nghĩ thì vì sao phải quy định vậy nhỉ?

 

Một số có 9 chữ số thập phân. Ví dụ : 26.400000000

Tớ "trim" số 0 tính từ bên phải số đó -> Xuất kết quả rất đẹp là 26.4

Ví dụ số 264.000000000 . Tớ "trim" số 0 tính từ bên phải số đó -> Xuất kết quả là 264. -> Thêm 0 đằng sau -> Xuất kết quả rất đẹp là 264.0

* Mục đích là tránh sai lệch do chữ số thập phân

Tớ chọn số 9 vì lisp của tớ chịu ảnh hưởng của biến hệ thống Dimzin, luprec (thiết lập trong Unit) có tối đa là 9 chữ số thập phân

Bạn chọn số 1 thì sợ rằng có sai lệch. Tỉ dụ : 26.52 -> thành 26.5


  • 1

#1607 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5451 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 19 April 2013 - 07:44 PM

Nếu nhằm mục đích tính biểu thức Cal của 1 String thì TL dùng cái này xem:

 

(defun C:HA (/ str ent)
 (vl-load-com)
 (setq str (getstring "\nCong thuc CAL: "))
 (setq ent (entmakex (list (cons 0 "TEXT") (cons 10 '(0 0)) (cons 40 1.) (cons 1 "HA"))))
 (vla-put-TextString (vlax-ename->vla-object ent)
  (strcat "%<\\AcExpr (" (vl-string-subst (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID (vlax-ename->vla-object ent))) ">%).TextString>%") "[VALUE]" str)")>%"))
 (princ (cdr (assoc 1 (entget (entlast)))))
 (entdel (entlast))
 (princ))

  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1608 duy267

duy267

    biết vẽ point

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

Đã gửi 19 April 2013 - 08:57 PM

Mình có một File Excel đang mở. Làm cách nào để mình kiểm tra File đó đang mở hay không bằng lisp? Xin cảm ơn.


  • 0

#1609 KangKung

KangKung

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 227 (khá)

Đã gửi 19 April 2013 - 11:51 PM

Mình có một File Excel đang mở. Làm cách nào để mình kiểm tra File đó đang mở hay không bằng lisp? Xin cảm ơn.

Bạn dùng hàm này thử xem. Giá trị trả về là T thì file đang được mở.

(defun check (file1 / file2)
 (cond ((setq file2 (open file1 "a"))
        (close file2)))
 (not file2))

  • 1

#1610 duy267

duy267

    biết vẽ point

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

Đã gửi 20 April 2013 - 12:59 AM

Bạn dùng hàm này thử xem. Giá trị trả về là T thì file đang được mở.

(defun check (file1 / file2)
 (cond ((setq file2 (open file1 "a"))
        (close file2)))
 (not file2))

Cảm ơn KangKung. Mình cũng vừa tìm được một vài hàm của LM.

(defun _FileOpen-p ( filename / f )
  (if (setq f (open fn "a"))
    (close f)
    t
  )
)

Hàm này tương tự của bạn.

Hoặc

(defun _FileOpen-p ( filename )
  (not (vl-file-rename filename filename))
)

  • 0

#1611 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 20 April 2013 - 06:19 AM

Nếu nhằm mục đích tính biểu thức Cal của 1 String thì TL dùng cái này xem:

 

(defun C:HA (/ str ent)
 (vl-load-com)
 (setq str (getstring "\nCong thuc CAL: "))
 (setq ent (entmakex (list (cons 0 "TEXT") (cons 10 '(0 0)) (cons 40 1.) (cons 1 "HA"))))
 (vla-put-TextString (vlax-ename->vla-object ent)
  (strcat "%<\\AcExpr (" (vl-string-subst (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID (vlax-ename->vla-object ent))) ">%).TextString>%") "[VALUE]" str)")>%"))
 (princ (cdr (assoc 1 (entget (entlast)))))
 (entdel (entlast))
 (princ))

 

 

Lisp bác DVH viết trên không có tác dụng với integer "vượt giới hạn"

Còn vụ biến e : CAL không chấp nhận biến e đã lượng giá. Chưa thấy bác phản hồi:

 
Command: (setq e 2)
2
Command: (cal "e*2")
0.0

  • 0

#1612 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5451 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 20 April 2013 - 08:25 AM

1). Bác cho ví dụ đi, rồi hãy bàn tiếp về Cal. Cách biểu diễn kết quả của Cal khó hiểu lắm. Và nói chung là kết quả các phép tính với số lớn.

2). Tôi chỉ nói là Cal tính với cả biến đã lượng giá. Và sự thực là nó đúng vậy. Còn em E này đặc biệt quá, tôi biết đâu mà trả lời. :lol:


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1613 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 20 April 2013 - 09:53 AM

Lợi dụng field để thay thế cho Cal. Một ý tưởng khá mới mẻ. Liệu có cách nào để định giá 1 biểu thức field luôn chứ không cần phải thông qua bước gắn vào text không nhỉ?

@Tue_NV: Lisp này của bạn ĐVH không nhằm mục đích chuyển đổi chuỗi theo yêu cầu của mình, bạn í chỉ đưa ra 1 giải pháp thay thế việc sử dụng cal thôi. Tất nhiên là dù sử dụng giải pháp nào đi nữa thì Cad vẫn đưa ra giới hạn chung cho các kiểu dữ liệu. nên dù có sử dụng cách của bạn ĐVH thì vẫn phải dùng đến code của bạn.

 

Nếu nhằm mục đích tính biểu thức Cal của 1 String thì TL dùng cái này xem:

 (strcat "%<\\AcExpr (" (vl-string-subst (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa (vla-get-ObjectID (vlax-ename->vla-object ent))) ">%).TextString>%") "[VALUE]" str)")>%"))

  • 0

#1614 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5451 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 20 April 2013 - 10:30 AM

Dù có sử dụng lisp nào đi nữa thì khi đưa vào lệnh Cal cũng phải chấp nhận 1 thực tế: với các số quá lớn (lớn đến bao nhiêu thì tôi không biết), kết quả trả về của Cal nhiều khi không như mong muốn, không cứ gì nó là real hay integer.

VD chúng ta cần tính 123456789^10.

Lisp của tôi:

822526259147102590000000000000000000000000000000000000000000000000000000000000000.000000

Lisp của Tue_NV hay KK, sau khi chuyển 123456789^10 sang 123456789.0^10 thì dùng Cal sẽ cho kết quả:

 

8.22526259e+080

Cả 2 kết quả này đều... không đúng.

Nhưng nếu trong biểu thức đó chúng ta đã làm thêm các phép tính khác để kết quả trả về nhỏ đi thì tất cả đều đúng:

Của ĐVH: 123456789^10/123456789^9 >> 123456789 >> đúng.

Của Tue_NV+KK: 123456789.0^10/123456789.0^9 > 123456789 >> đúng.

Vậy, bản chất vấn đề là kết quả trả về của Cal chứ không phải của lisp.

Nói rộng ra, trong các phần mềm khác cũng vậy: khi tính toán với các số lớn nó thường trả về kết quả không như mong muốn.

VD với Excel:

123456789.0^2 >> 15241578750190500.00 >> sai bét nhè!

Chắc phải chấp nhận sống chung với lũ thôi! :lol:

Về ý kiến thứ 2, tôi nghĩ chắc có thể được. Để xem sao.

82252625914710259000000000000000000000000000000000000000000000000000000000000000
0.000000
 
82252625914710259000000000000000000000000000000000000000000000000000000000000000
0.000000
 
82252625914710259000000000000000000000000000000000000000000000000000000000000000
0.000000
 
82252625914710259000000000000000000000000000000000000000000000000000000000000000
0.000000
 
82252625914710259000000000000000000000000000000000000000000000000000000000000000
0.000000

  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1615 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 20 April 2013 - 11:18 AM

Với Field: Máy của mình tính toán với số lớn trả về kết quả không ổn đinh. Nếu mình tăng dần độ lớn số học của biểu thức thì HA chạy được. nhưng chạy lần đầu với biểu thức lớn thì lại trả về 4 ký tự ####

Với Cal: Tính toán với số cực lớn, dĩ nhiên là sẽ sai. Bởi cũng như Integer, Real cũng có giới hạn riêng. vượt qua giới hạn này thì không tính được nữa. Đây là bản chất của vấn đề mà bạn phải nắm được.

Nhưng giới hạn của Real lớn hơn của Integer rất nhiều. Ở đây mình không quan tâm đến điều gì đó là chân lý, là sự đúng đắn tuyệt đối như toán học, mình chỉ quan tâm đến hiệu quả sử dụng. Khi đó giới hạn của Real hoàn toàn đáp ứng được nhu cầu của mình rồi. Nhưng nếu mà lượng giá được biểu thức field thì không có lý gì mà ta lại không chuyển sang Field nhỉ. Vừa tiện, mà lại có nhiều thứ hay ho để dùng.


  • 0

#1616 classicgt

classicgt

    biết zoom

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

Đã gửi 20 April 2013 - 11:55 AM

Chào tất cả các bác cao thủ về lisp.

Em không biết viết bài mới ở Cadviet như thế nào cả đành nhờ trong bài viết này vậy.

Em có một nguyện vọng muốn nhờ các bác viết giúp cho em 1 lisp với nội dung như sau:

lisp lấy thông số của nhiều đường poline cùng một lúc rồi xuất sang EXcel như dạng sau:

VD: Có 2 đường Poline 

 

TT                                  Thông số của Poline (có thể 2 (đầu, cuối) hoặc 3 điểm (đầu, giữa cuối)

 1                                                     at point  X=? Y=?  Z=   ?

                                                        at point  X=? Y=?  Z=   ?

                                                        .....................................

 2                                                      at point  X=? Y=?  Z=   ?

                                                         at point  X=? Y=?  Z=   ?

                                                         .....................................

....

....

 

 

Em rất mong các bác có thể giúp em, vì bình thường lệnh "LI" chỉ lấy được thông số của 1 đối tượng Poline

Em muốn dùng lisp dùng một lệnh lấy được thông số của nhiều đường cùng một lúc rồi xuất ra EXcel như trên.

   Cám ơn các bác nhiều lắm.

Giúp em nhé! 

 

 

 

 

=> Câu này trên diễn đàn hoặc Google có nhiều lắm rồi bạn n

Em tìm không thấy, mong các bác giúp em


  • 0

#1617 neter

neter

    Chưa sử dụng CAD

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

Đã gửi 20 April 2013 - 06:29 PM

Mình đang cần gấp 1 hàm có chức năng tìm trong 1 đoạn string các đoạn là integer để chuyển chúng về real.
ví dụ: "a2b3.1c5" chuyển thành "a2.0b3.1c5.0"
Do đang cần gấp mà mình bận quá không có thời gian mò mẫm nên đành cầu cứu các bạn. Bạn nào đã từng viết hàm như thế này rồi vui lòng cho mình xin. Cảm ơn các bạn!

 
Thấy mấy bac bàn tán hay quá, em tìm thấy một cái thế này không biết có xài được không. Cái này em copy của một bác, bác ấy viết với chuỗi int thôi em chỉnh tí xíu ứng dụng với real.
 
 

(defun Divide_Alpha_digit(string / Digit_list Digit_first Dstr Cstr Dlist Clist si)
(setq Digit_list (list "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "."))
(if (member (substr string 1 1) Digit_list)
(setq Digit_first t)
(setq Digit_first nil)
)
(setq Dstr ""
Cstr ""
Dlist '()
Clist '()
si 1
)
(while (< si (+ (strlen string) 2))
(setq stri (substr string si 1))
(if (member stri Digit_list)
(progn
(setq Dstr (strcat Dstr stri))
(if (/= Cstr "")
(setq Clist (append Clist (list Cstr))
Cstr ""
string (substr string si (- (strlen string) si -1))
si 1
)
)
)
(progn
(setq Cstr (strcat Cstr stri))
(if (/= Dstr "")
(setq Dlist (append Dlist (list Dstr))
Dstr ""
string (substr string si (- (strlen string) si -1))
si 1
)
)
)
)
(setq si (1+ si))
)
(if (/= Dstr "") (setq Dlist (append Dlist (list Dstr))))
(if (/= Cstr "") (setq Clist (append Clist (list Cstr))))
(setq Dlist (mapcar 'atof Dlist))
(if Digit_first
(list Dlist Clist)
(list Clist Dlist)
)
)
;=================================================
(defun Separate_Alpha_digit(string / Out Tlist l1 l2 li)
(setq Out '())
(setq Tlist (Divide_Alpha_digit string))
(setq l1 (nth 0 Tlist))
(setq l2 (nth 1 Tlist))
(if l2
(progn
(setq li 0)
(while (< li (length l1))
(setq Out (append Out (list (nth li l1))))
(if (< li (length l2))
(setq Out (append Out (list (nth li l2))))
)
(setq li (1+ li))
)
)
(setq Out l1)
)
Out
)
;=================================================
(defun JoinListToString(TempList / )
(apply 'strcat (mapcar '(lambda (x) (if (= (type x) 'REAL) (rtos x 2 9) x)) TempList))
)
;=================================================

 
em thử với: (JOINLISTTOSTRING (SEPARATE_ALPHA_DIGIT "(5+2)* 3"))

được:  "(5.000000000+2.000000000)* 3.000000000"

 

Bài gốc ở đây nè, em copy và edit tí thôi:
http://www.tramx.vn/...god420201344536


  • 0

#1618 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 21 April 2013 - 07:18 AM

1). Bác cho ví dụ đi, rồi hãy bàn tiếp về Cal. Cách biểu diễn kết quả của Cal khó hiểu lắm. Và nói chung là kết quả các phép tính với số lớn.

2). Tôi chỉ nói là Cal tính với cả biến đã lượng giá. Và sự thực là nó đúng vậy. Còn em E này đặc biệt quá, tôi biết đâu mà trả lời. :lol:

 

1) Cal không chấp nhận biến e. Các biến có số đằng trước e cũng không chấp nhận. Ví dụ 1e, 2e,..... Cal cũng không chấp nhận.

KetXu nói biến "nhỡ e của người ta là biến có giá trị thì ... giết người rồi ^^" là sai hoàn toàn

 

2) Đúng nhưng không hoàn toàn. 

* Tóm lại: Nếu đã sử dụng biến thì dùng các hàm Lisp để tính toán thay cho CAL, đề phòng TH có biến "e" như TH trên, các hàm của LISP còn hơn CAL nữa ấy chứ

 

 

.......Nhưng nếu mà lượng giá được biểu thức field thì không có lý gì mà ta lại không chuyển sang Field nhỉ. Vừa tiện, mà lại có nhiều thứ hay ho để dùng.

 

Đã lượng giá được Field thông qua Text rồi đấy thôi. Còn bạn viết là lượng giá Field không cần qua Text thì chắc là không thể được vì bản thân lệnh Field cũng phải lượng giá qua MTEXT (Trừ khi bạn là tác giả của ACAD)


  • 0

#1619 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 21 April 2013 - 07:33 AM

 
Thấy mấy bac bàn tán hay quá, em tìm thấy một cái thế này không biết có xài được không. Cái này em copy của một bác, bác ấy viết với chuỗi int thôi em chỉnh tí xíu ứng dụng với real.
 
 

(defun Divide_Alpha_digit(string / Digit_list Digit_first Dstr Cstr Dlist Clist si)
(setq Digit_list (list "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "."))
(if (member (substr string 1 1) Digit_list)
(setq Digit_first t)
(setq Digit_first nil)
)
(setq Dstr ""
Cstr ""
Dlist '()
Clist '()
si 1
)
(while (< si (+ (strlen string) 2))
(setq stri (substr string si 1))
(if (member stri Digit_list)
(progn
(setq Dstr (strcat Dstr stri))
(if (/= Cstr "")
(setq Clist (append Clist (list Cstr))
Cstr ""
string (substr string si (- (strlen string) si -1))
si 1
)
)
)
(progn
(setq Cstr (strcat Cstr stri))
(if (/= Dstr "")
(setq Dlist (append Dlist (list Dstr))
Dstr ""
string (substr string si (- (strlen string) si -1))
si 1
)
)
)
)
(setq si (1+ si))
)
(if (/= Dstr "") (setq Dlist (append Dlist (list Dstr))))
(if (/= Cstr "") (setq Clist (append Clist (list Cstr))))
(setq Dlist (mapcar 'atof Dlist))
(if Digit_first
(list Dlist Clist)
(list Clist Dlist)
)
)
;=================================================
(defun Separate_Alpha_digit(string / Out Tlist l1 l2 li)
(setq Out '())
(setq Tlist (Divide_Alpha_digit string))
(setq l1 (nth 0 Tlist))
(setq l2 (nth 1 Tlist))
(if l2
(progn
(setq li 0)
(while (< li (length l1))
(setq Out (append Out (list (nth li l1))))
(if (< li (length l2))
(setq Out (append Out (list (nth li l2))))
)
(setq li (1+ li))
)
)
(setq Out l1)
)
Out
)
;=================================================
(defun JoinListToString(TempList / )
(apply 'strcat (mapcar '(lambda (x) (if (= (type x) 'REAL) (rtos x 2 9) x)) TempList))
)
;=================================================

 
em thử với: (JOINLISTTOSTRING (SEPARATE_ALPHA_DIGIT "(5+2)* 3"))

được:  "(5.000000000+2.000000000)* 3.000000000"

 

Bài gốc ở đây nè, em copy và edit tí thôi:
http://www.tramx.vn/...god420201344536

 

Sài được, có điều lisp này cũng giống với Lisp bác DVH, KangKung, chưa xử lý được với số thực có chứa E (Ví dụ : "1E3+123456789^10")


  • 0

#1620 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 21 April 2013 - 02:26 PM

bác Tuệ phán ket kinh quá :( Bác Tuệ đọc lại ví dụ của bác Hạ và của bác, ngay cạnh nhau, lẽ nào bác k phân biệt được 2 cái đó khác nhau ở đâu :( Cal là cal nói chung, k phải chỉ có hàm cal, mà có cả lệnh cal bác ạ. Hàm cal chỉ là một phần của lệnh cal
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC