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

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

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

Mong các cao thủ lisp giúp giùm em.

Em có một bình đồ gồm nhiều đường đồng mức (mỗi đường DM là một PL. Nhưng em lại chỉ muốn các đường đồng mức thể hiện trong vùng em chọn mà thôi(vùng chọn được bao bằng PL) còn phần ngoài ẩn đi chứ không phải xén bớt phần bên ngoài vùng chọn. Cám ơn các bác nhiề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
Mong các cao thủ lisp giúp giùm em.

Em có một bình đồ gồm nhiều đường đồng mức (mỗi đường DM là một PL. Nhưng em lại chỉ muốn các đường đồng mức thể hiện trong vùng em chọn mà thôi(vùng chọn được bao bằng PL) còn phần ngoài ẩn đi chứ không phải xén bớt phần bên ngoài vùng chọn. Cám ơn các bác nhiều.

Trường hợp này bạn nên sử dụng lệnh XClip hay lệnh Clipit.

Hãy post bài của bạn và có thể kèm theo file bản vẽ của bạn ở đây :

http://www.cadviet.com/forum/index.php?sho...amp;#entry48665

Mọi người sẽ giúp bạn. Cám ơ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
Mong các cao thủ lisp giúp giùm em.

Em có một bình đồ gồm nhiều đường đồng mức (mỗi đường DM là một PL. Nhưng em lại chỉ muốn các đường đồng mức thể hiện trong vùng em chọn mà thôi(vùng chọn được bao bằng PL) còn phần ngoài ẩn đi chứ không phải xén bớt phần bên ngoài vùng chọn. Cám ơn các bác nhiều.

Bạn sang topic "Viết lisp theo yêu cầu", hoặc lập topic mới. Topic này, theo như tên gọi cũng như các nội dung đã post, là để dành riêng cho các bạn đang tự lập trình lisp và đang có những vướng mắc cần trao đổi thêm.

Sự tuỳ tiện sẽ làm phá vỡ cấu trúc chung của diễn đàn. Tên topic sẽ chẳng còn ý nghĩa gì nữa!

Mong bạn hiểu và không cảm thấy phật lòng.

 

P/S

1. Sang topic kia cũng thấy nội dung y chang như bên này! Lần sau, nếu tiếp tục như vậy sẽ bị xoá luôn cả 2 bài!

2. Vấn đề của bạn chẳng dính gì đến Lisp. Hãy làm theo gợi ý của bạn Tue_NV

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
Topic này, theo như tên gọi cũng như các nội dung đã post, là để dành riêng cho các bạn đang tự lập trình lisp và đang có những vướng mắc cần trao đổi thêm.

Cảm ơn bác SSg. Bác SSg và mọi người trên diễn đàn cho mình hỏi cấu trúc của hàm If một tý :

Cú pháp:

(if testexpr thenexpr [elseexpr])

Giải thích:

testexpr: Là biểu thức kiểm tra điều kiện

thenexpr: Biểu thức lệnh được thực hiện nếu biểu thức testexpr nhận giá trị T

elseexpr: Biểu thức lệnh được thực hiện nếu biểu thức testexpr nhận giá Nil. Nếu không có biểu thức này, hàm không thực hiện và trả về giá trị nil

 

Và trong đoạn Lisp này :

(defun c:nso()

(setvar "CMDECHO" 0)

(setq pre (getint "\nSo chu so sau dau phay?"))

(command "luprec" pre)

(setq co (getreal "\nGia tri can so nhan:"))

(SETQ TH (SSget)

QUANT (if TH (SSLENGTH TH))

INDEX 0

)

(WHILE (

(setq s (entget (SSNAME TH INDEX))

otext (assoc 1 s)

ot (cdr otext)

ot (atof ot)

nt (cons 1 (rtos (* ot co)))

s (subst nt otext s)

)

(entmod s)

(setq index (+ index 1))

)

(command "luprec" "4")

)

 

 

(if TH (SSLENGTH TH))

Cái dòng in đậm thể hiện cấu trúc của hàm if, em chưa hiểu testexpr: Là biểu thức kiểm tra điều kiện như thế nào ? Các Bác trên diễn đàn giải thích dùm em với. Cảm ơn các bác nhiều lắm.

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
(if TH (SSLENGTH TH))

Cái dòng in đậm thể hiện cấu trúc của hàm if, em chưa hiểu testexpr: Là biểu thức kiểm tra điều kiện như thế nào ? Các Bác trên diễn đàn giải thích dùm em với. Cảm ơn các bác nhiều lắm.

testexpr ở đây là TH . Nếu tồn tại TH (TH/=nil) thì thực hiện (SSLENGTH TH), ngoài ra (TH=nil) thì bỏ qua

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
testexpr ở đây là TH . Nếu tồn tại TH (TH/=nil) thì thực hiện (SSLENGTH TH), ngoài ra (TH=nil) thì bỏ qua

Cám ơn Nataca. Bạn và mọi người có thể cho mình hỏi đoạn Lisp Convert ss thành List

(defun ss2ent (ss / sodt index lstent)

(setq

sodt (if ss (sslength ss) 0)

index 0

)

(repeat sodt

(setq ent (ssname ss index)

index (1+ index)

lstent (cons ent lstent)

)

)

(reverse lstent)

)

 

Đến đoạn màu đậm là chưa hiểu về biến lstent. Mong bạn và mọi người giải thích dùm mình tý. Cảm ơ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
Cám ơn Nataca. Bạn và mọi người có thể cho mình hỏi đoạn Lisp Convert ss thành List

(defun ss2ent (ss / sodt index lstent)

(setq

sodt (if ss (sslength ss) 0)

index 0

)

(repeat sodt

(setq ent (ssname ss index)

index (1+ index)

lstent (cons ent lstent)

)

)

(reverse lstent)

)

 

Đến đoạn màu đậm là chưa hiểu về biến lstent. Mong bạn và mọi người giải thích dùm mình tý. Cảm ơn.

Giá trị ban đầu của lstent trong trường hợp này là '()lstent được khai báo là biến cục bộ của hàm ss2ent

(cons ent lstent) có nghĩa là thêm phần tử ent vào vị trí đầu tiên của danh sách lstent -> giá trị của lstent : (ent1) rồi (ent2 ent1) rồi (ent3 ent2 ent1)....cứ vậy

(reverse lstent) giúp đảo ngược list lstent-> lstent sẽ trở thành (ent1 ent2 ent3....)

 

Ta có thể thay đoạn code trên bằng đoạn code này:

(setq lstent (append lstent (list ent)))

như vậy không cần bước (reverse lstent) nữa.

  • 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
Giá trị ban đầu của lstent trong trường hợp này là '()lstent được khai báo là biến cục bộ của hàm ss2ent

(cons ent lstent) có nghĩa là thêm phần tử ent vào vị trí đầu tiên của danh sách lstent -> giá trị của lstent : (ent1) rồi (ent2 ent1) rồi (ent3 ent2 ent1)....cứ vậy

(reverse lstent) giúp đảo ngược list lstent-> lstent sẽ trở thành (ent1 ent2 ent3....)

 

Ta có thể thay đoạn code trên bằng đoạn code này:

(setq lstent (append lstent (list ent)))

như vậy không cần bước (reverse lstent) nữa.

Cảm ơn Nataca. Mấu chốt của bài toán trên chính là biến lstent. Biến này chứa danh sách ename của đối tượng trong tập hợp chọn. Cái mà mình thắc mắc đó chính là giá trị khởi tạo của biến lstent. Theo như Nataca nói thì giá trị ban đầu của lstent trong trường hợp này là '() vì lstent được khai báo là biến cục bộ của hàm ss2ent. Tức là giá trị ban đầu của lstent chính là một list rỗng phải không?

 

Nhưng trong đoạn định nghĩa hàm ss2ent : (defun ss2ent (ss / sodt index lstent)

 

Ta thấy sodt, index, lstent là 3 biến cục bộ của hàm ss2ent

Biến sodt được khởi tạo với giá trị ban đầu : (if ss (sslength ss) 0)

Biến index được khởi tạo với giá trị ban đầu là 0.

Còn mình không thấy biến lstent không được khởi tạo?

Và nếu có thì biến lstent được khởi tạo như thế nào? Và giá trị ban đầu của biến lstent là một list rỗng.

Các bạn có thể giải thích cho mình một chút được không? Thanks

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
Cảm ơn Nataca. Mấu chốt của bài toán trên chính là biến lstent. Biến này chứa danh sách ename của đối tượng trong tập hợp chọn. Cái mà mình thắc mắc đó chính là giá trị khởi tạo của biến lstent. Theo như Nataca nói thì giá trị ban đầu của lstent trong trường hợp này là '() vì lstent được khai báo là biến cục bộ của hàm ss2ent. Tức là giá trị ban đầu của lstent chính là một list rỗng phải không?

 

Nhưng trong đoạn định nghĩa hàm ss2ent : (defun ss2ent (ss / sodt index lstent)

 

Ta thấy sodt, index, lstent là 3 biến cục bộ của hàm ss2ent

Biến sodt được khởi tạo với giá trị ban đầu : (if ss (sslength ss) 0)

Biến index được khởi tạo với giá trị ban đầu là 0.

Còn mình không thấy biến lstent không được khởi tạo?

Và nếu có thì biến lstent được khởi tạo như thế nào? Và giá trị ban đầu của biến lstent là một list rỗng.

Các bạn có thể giải thích cho mình một chút được không? Thanks

Trong lisp thì biến được gán thuộc về loại nào (chuỗi, list, số...) phụ thuộc vào việc mình gán giá trị cho nó. Ví dụ index =0 thì tức là vừa gán cho index giá trị 0 vừa gán cho nó thuộc loại số. hàm cons cũng vậy. (cons ent lstent) tức vừa gán lstent loại list (nếu lstent chưa được gán giá trị) vừa thêm phần tử ent vào list

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

Các bác cho em hỏi, nếu em có 2 hàm chính A và B, mỗi hàm chính gồm 3 hàm con A1 A2 A3 và B1 B2 B3, vậy làm cách nào để gộp lại thành 1 hàm mới C gồm 2 hàm chính A và B.

 

Ví dụ :

 

(defun c:A ()

(setq ss (ssget))

...)

(defun A1 ()

...)

-------------------

(defun c:B ()

(setq ss (ssget))

...)

(defun B1 ()

...)

 

Xin cám ơn nhiề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

Ví dụ :

 

(defun c:A ()

(setq ss (ssget))

...)

(defun A1 ()

...)

-------------------

(defun c:B ()

(setq ss (ssget))

...)

(defun B1 ()

...)

(defun c:C ()

__(C:A)

__(C: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
Các bác cho em hỏi, nếu em có 2 hàm chính A và B, mỗi hàm chính gồm 3 hàm con A1 A2 A3 và B1 B2 B3, vậy làm cách nào để gộp lại thành 1 hàm mới C gồm 2 hàm chính A và B.

Ví dụ :

(defun c:A ()

...)

-------------------

(defun c:B ()

...)

Bạn thử gộp như sau :

(defun c:AB ()

(c:A)

(c: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
Các bác cho hỏi để tác động đến hộp thoại của Qleader phải làm thế nào.

Cụ thể là 2 thằng Annotation type chọn None và Number of points là 2.

Xin cám ơn nhiều.

(COMMAND "QLEADER" "" PAUSE)

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ào bạn Tue_NV

Ý của mình là cách viết lisp đó bạn.

Mình muốn mặc định Annotation type là None và Number of points là 2.

Bạn sử dụng qlset.lsp - Frank Whaley, Autodesk

với hàm (acet-ql-get )

trong trường hợp của bạn : Set Annotation type là None và Number of points là 2

tại dấu nhắc lệnh gõ : (acet-ql-set '((60 . 4)(67 . 2)))

Chúc thành công.

;;; qlset.lsp - example initialization of QLEADER settings
;;; Frank Whaley, Autodesk
;;; 
;;; Two functions are included in this file:
;;; 
;;; (acet-ql-Set)
;;; Returns an association list containing the current QLEADER settings from the
;;; Named Object Dictionary.
;;; 
;;; (acet-ql-get )
;;; Sets the specified values for QLEADER settings from the given association
;;; list.
;;; Returns an association list containing the new values.
;;; 
;;; These functions can be used to examine the current QLEADER settings, or to
;;; initialize the setting before using the QLEADER command.
;;; For example, to use splined leaders and framed text:
;;; 
;;; (acet-ql-set '((65 . 1)(72 . 1)))
;;; 
;;; Both functions use the following group codes to identify QLEADER settings:
;;; 
;;;  3: user arrowhead block name (default="")
;;;  40: default text width (default=0.0)
;;;  60: annotation type (default=0)
;;;      0=MText
;;;      1=copy object
;;;      2=Tolerance
;;;      3=block
;;;      4=none
;;;  61: annotation reuse (default=0)
;;;      0=none
;;;      1=reuse next
;;;  62: left attachment point (default=1)
;;;  63: right attachment point (default=3)
;;;      0=Top of top line
;;;      1=Middle of top line
;;;      2=Middle of multiline text
;;;      3=Middle of bottom line
;;;      4=Bottom of bottom line
;;;  64: underline bottom line (default=0)
;;;  65: use splined leader line (default=0)
;;;  66: no limit on points (default=0)
;;;  67: maximum number of points (default=3)
;;;  68: prompt for MText width (word wrap) (default=1)
;;;  69: always left justify (default=0)
;;;  70: allowed angle, first segment (default=0)
;;;  71: allowed angle, second segment (default=0)
;;;      0=Any angle
;;;      1=Horizontal
;;;      2=90deg
;;;      3=45deg
;;;      4=30deg
;;;      5=15deg
;;;  72: frame text (default=0)
;;; 170: active tab (default=0)
;;;      0=Annotation
;;;      1=Leader Line & Arrow
;;;      2=Attachment
;;; 340: object ID for annotation reuse
;;; 
;;; |;
acad-push-dbmod
(defun acet-ql-get (/ xr cod itm reply)
 (if (setq xr (dictsearch (namedobjdict) "AcadDim"))
   (progn
     (foreach cod '(3 40 60 61 62 63 64 65 66 67 68 69 70 71 72 170 340)
       (if (setq itm (assoc cod xr))
         (setq reply (append reply (list itm)))))
     reply)
   '((3 . "")
     (40 . 0.0)
     (60 . 0)
     (61 . 1)
     (62 . 1)
     (63 . 3)
     (64 . 0)
     (65 . 0)
     (66 . 0)
     (67 . 3)
     (68 . 1)
     (69 . 0)
     (70 . 0)
     (71 . 0)
     (72 . 0)
     (170 . 0))))

(defun acet-ql-set (arg / cur prm)
 ;;  fetch current
 (setq cur (acet-ql-get))

 ;;  override per argument
 (while arg
   (setq prm (car arg)
         arg (cdr arg)
         cur (subst prm (assoc (car prm) cur) cur) )
   ;;  handle DIMLDRBLK
   (if (= 3 (car prm))
     (setvar "DIMLDRBLK" (cdr prm))))

 ;;  put back
 (dictremove (namedobjdict) "AcadDim")
 (setq cur (append '((0 . "XRECORD")(100 . "AcDbXrecord")(90 . 990106))
cur))
 (dictadd (namedobjdict) "AcadDim" (entmakex cur))

 (acet-ql-get))

;;  load quietly
(princ)

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ạn sử dụng qlset.lsp - Frank Whaley, Autodesk

với hàm (acet-ql-get )

trong trường hợp của bạn : Set Annotation type là None và Number of points là 2

tại dấu nhắc lệnh gõ : (acet-ql-set '((60 . 4)(67 . 2)))

Chúc thành công.

 

Chào bác gia_bach

Cái thằng Qleader này phức tạp quá.

Em sẽ thử vận dụng liền vào cái lisp đang viết.

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

Chúc bác luôn vui vẻ, thành cô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

Xin hỏi để sẻarch linetype center có tồn tại trong bản vẽ hay không thì dùng đoạn code dưới đây sai ở chổ nào

 

(defun c:test ()

(if (not (tblobjname "linetype" "center"))

(command "linetype" "l" "center" "" ""))

)

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
Xin hỏi để sẻarch linetype center có tồn tại trong bản vẽ hay không thì dùng đoạn code dưới đây sai ở chổ nào

 

(defun c:test ()

(if (not (tblobjname "linetype" "center"))

(command "linetype" "l" "center" "" ""))

)

Chào bạn tuan_thietkedien.

Để search LineType bạn dùng : (tblsearch "ltype" "center")

Và bạn xem lại cú pháp lệnh LineType nhé. Tại dấu nhắc lệnh gõ : -linetype

頑張って下さい。

  • 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
Chào bạn tuan_thietkedien.

Để search LineType bạn dùng : (tblsearch "ltype" "center")

Và bạn xem lại cú pháp lệnh LineType nhé. Tại dấu nhắc lệnh gõ : -linetype

頑張って下さい。

 

Gia_bach様

何時もお世話になっております。

宜しくお願い致します。

:cry:

  • 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
Gia_bach様

何時もお世話になっております。

宜しくお願い致します。

:cry:

Ối giời ới,

Mấy bác này chạy khiếp quá, sang tới Nhựt rồi đó, từ từ cho anh em theo với ới các bác ớ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

Chào mọi người.

Mình muốn hỏi cái lisp xoay đối tượng dưới đây sao nó lại không xoay theo giá trị góc mình nhập vào.

Xin được giúp đỡ.

 

(defun c:xoay ( / ss i e d )
(if (not rt0) (setq rt0 45))
(setq rt (getint(strcat "\n Gia tri Rotate : <" (itoa rt0) "> :")))
(if (not rt) (setq rt rt0) (setq rt0 rt))

(setq ss (ssget)
i 0)
(while
(< i (sslength ss))
(setq
e (ssname ss i)
d (entget e)
d (subst (cons 50 rt) (assoc 50 d) d)
i (1+ i)
)
(entmod d)
)
(princ)
)

 

Xin cám ơ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
Chào mọi người.

Mình muốn hỏi cái lisp xoay đối tượng dưới đây sao nó lại không xoay theo giá trị góc mình nhập vào.

Xin được giúp đỡ.

 

(defun c:xoay ( / ss i e d )
(if (not rt0) (setq rt0 45))
(setq rt (getint(strcat "\n Gia tri Rotate :  :")))
(if (not rt) (setq rt rt0) (setq rt0 rt))

(setq ss (ssget)
i 0)
(while
((setq
e (ssname ss i)
d (entget e)
d (subst (cons 50 rt) [color="#FF0000"](assoc 50 d)[/color] d)
i (1+ i)
)
(entmod d)
)
(princ)
)

 

Xin cám ơn.

Tại Lisp không hiểu ý của bạn đấy thôi.

Bạn định xoay đối tượng nào nhỉ

(assoc 50 d) . thì mã dxf 50 thuộc về đối tượng nào? Lisp không hiểu và mình cũng không hiểu nó thuộc về đối tượng nào.

Bạn nói rõ hơn nhé.

  • 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
Chào mọi người.

Mình muốn hỏi cái lisp xoay đối tượng dưới đây sao nó lại không xoay theo giá trị góc mình nhập vào.

Xin được giúp đỡ.

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

Vì bạn chỉ xử lý code DXF 50 nên Tui đoán bạn muốn quay Text theo góc nhập vào. (bởi vì với các đối tượng khác như ARC, LINE... thì phải sử dụng cách khác )

Hơn nữa trong LISP nói chung : đơn vị góc được tính bằng Radian chứ không phải độ.

do đó bạn cần chuyển đổi từ độ -> radian

(defun deg->rad (f_ang)

(setq f_ang (* pi (/ f_ang 180.0)))

)

 

đây là LISP đã sửa đổi, hy vọng đúng ý bạn.

(defun c:xoay ( / ss i e d )
(if (not rt0) (setq rt0 45))
(setq rt (getint(strcat "\n Gia tri Rotate : <" (itoa rt0) "> :")))
(if (not rt) (setq rt rt0) (setq rt0 rt))
(setq rt1 (* pi (/ rt 180.0)))
(setq ss (ssget  '((0 . "TEXT")))
i 0)
(while
(< i (sslength ss))
(setq
e (ssname ss i)
d (entget e)
d (subst (cons 50 rt1) (assoc 50 d) d)
i (1+ i)
)
(entmod d)
)
(princ)
)

  • 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

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


×