Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Jin Yong

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

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

VoHoan    8

Bác nào biết trả lời em vấn đề naỳ với: Trong quá trình làm việc trên cad em phải load nhiều list, cho nên sẽ có những lúc các tham số hay biển của một số list trùng nhau mà vẫn tồn tại sau khi kết thúc lệnh. Làm sai lệch kết quả hay list thực hiện sau bị lỗi, vậy có cách nào xóa hết thông tin sau khi thực hiện xong một lệnh của list không; Hiện giờ em có 1 file xxxxx.lsp tổng hợp rất nhiều list trong đó, để đọc và tìm ra những biển cục bộ (biến địa phương) rất mất công với lại "Trình" list của em còn non nên ko dám đụng vào (sợ làm hỏng list). Mong các bác chỉ dùm cách.

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
thiep    263

Cho Thiep hỏi:

Có đoạn lisp nào dùng để mở 1 hay nhiều file DWG đang tồn tại không? Tôi đọc trên Help, có nói đến phương thức OPEN trong 1 đoạn mã VBA ví dụ như sau:

 

Sub Example_Open()

' The following example opens "C:\AutoCAD\Sample\city map.dwg" file.

' This drawing may not exist on your system. Change the drawing

' path and name to reflect a valid AutoCAD drawing on your system.

 

ThisDrawing.Application.Documents.Open ("C:\AutoCAD\Sample\city map.dwg")

 

End Sub

Thiep chịu bó tay, không hiểu làm sao để chuyển qua mã VL được. Nhờ các anh em chỉ giáo

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
phamthanhbinh    3.123
Chào mọi người mình có vấn đề muốn mọi người giúp giải thích như sau:

Cái lisp đổi điểm chèn block mình viết xong rồi nhưng không ưng ý vì trong quá trình thực hiện lệnh còn phải dùng đến lệnh move, mình muốn thay đổi điểm chèn bằng cách thay đổi trong dử liệu luôn

(setq DTMs (subst (cons 10 DIEMDOI) (assoc 10 DTMs) DTMs))

(entmod DTMs)

nhưng nó lại chạy bậy trong khi dùng move (command "move" DTs "" (list 0 0) DIEMDOI) được kết quả đúng chứng tỏ DIEMDOI mình tính ra là đúng. Mình nghi là gặp vấn đề ở (command "ucs" "ob" doituong1) nhưng không rỏ thực hư thế nào. bạn nào rành có thể giúp mình rỏ vướng mắc trên không?

 

(defun C:DBL ()

(command "undo" "be")

 

(setq doituong1 (entsel "\nChon Block muon chinh diem chen"))

(while

(or

(null doituong1)

(/= "INSERT" (cdr (assoc 0 (entget (car doituong1)))))

)

(princ "\nDoi tuong khong phai la Block! Chon lai")

(setq doituong1 (entsel "\nChon Block muon chinh diem chen"))

)

 

(command "ucs" "ob" doituong1)

(setq DIEMCHENMOI (getpoint "\n Chon diem chen moi cho Block nay :"))

(setq luubatdiem (getvar "osmode")) (setq luulop (getvar "clayer"))

(setvar "osmode" 0)

(command "layer" "s" 0 "")

(setq doituong (car doituong1))

(setq doituong (entget doituong))

(setq TENKHOI (cdr (assoc 2 doituong)))

(setq TENKHOIMOI (strcat TENKHOI "TAOTHEM"))

(setq TYLEX (cdr (assoc 41 doituong)))

(setq TYLEY (cdr (assoc 42 doituong)))

(setq DIEMTINH (list (/ (car DIEMCHENMOI) TYLEX) (/ (cadr DIEMCHENMOI) TYLEY)))

(setq XDIEMTINH (car DIEMTINH))

(setq YDIEMTINH (cadr DIEMTINH))

(setq DAICHUAS (distance (list 0 0) DIEMTINH))

(setq GOCCHUAS (angle (list 0 0) DIEMTINH))

(setq DIEMCHENTUONGDOI (polar (LIST 0 0) GOCCHUAS DAICHUAS))

(command ".INSERT" TENKHOI (LIST 0 0) 1 1 0)

(Command "EXPLODE" "last" "")

(Command "Block" TENKHOIMOI DIEMCHENTUONGDOI "Previous" "")

(command "ucs" "p")

(setq xx (ssget "X" (list( cons 0 "INSERT") (cons 2 TENKHOI))))

 

(setq L 0)

(setq M (sslength XX))

(while (

(setq DTs (ssname XX L))

(setq DTMs (entget DTs))

(command "ucs" "ob" DTs)

(setq TYLEX1 (cdr (assoc 41 DTMs)))

(setq TYLEY1 (cdr (assoc 42 DTMs)))

(setq DIEMDOI (list (* XDIEMTINH TYLEX1) (* YDIEMTINH TYLEY1)))

 

(setq DTMs (subst (cons 2 TENKHOIMOI) (assoc 2 DTMs) DTMs))

(entmod DTMs)

;(setq DTMs (subst (cons 10 DIEMDOI) (assoc 10 DTMs) DTMs))

;(entmod DTMs)

(command "move" DTs "" (list 0 0) DIEMDOI)

(command "ucs" "p")

(setq L (1+ L))

)

(setvar "osmode" luubatdiem) (setvar "clayer" luulop)

(Command "Purge" "B" TENKHOI "Y" "Y")

(command "rename" "b" TENKHOIMOI TENKHOI)

(command "undo" "end")

 

(princ (strcat "\nVua chinh tam cua block :" (itoa L) " doi tuong"))

 

(Princ))

Chào bác Duy, bác co khỏe không ạ?

Đọc cái lisp bác post thì thấy cái giải pháp của bác G288 là khá ổn. Mình tuy còn phải mót dài dài nhưng xin phép bác múa rìu qua mắt thợ chút xíu.

Theo mình thì cái mắc chính là ở cái hàm (command "ucs" "ob" DTs). Khi đó bản vẽ được chuyển về hệ tọa độ đặt tại điểm chèn của block DTs. Cái DIEMDOI của bác được xác định theo hệ tọa độ này và do vậy cái hàm (command "move" DTs "" (list 0 0) DIEMDOI) của bác nó chạy ngon trớt.

Trong khi đó cái thằng DTMs của bác được xác định bởi hàm entget mà cái hàm này theo mình hiểu là nó luôn trả về các tọa độ được tính trong hệ tọa độ World, bất kể bác đang ngồi ở đâu.( Thực tế trong lisp này thì cái thằng DTMs của bác được xác định khi bác đang chồm hổm ở (command "ucs" "p") ) Do vậy để có thể xài cái hàm (setq DTMs (subst (cons 10 DIEMDOI) (assoc 10 DTMs) DTMs)), ngoài việc bác phải trả về hệ tọa độ World , bác còn phải chuẩn lại cái thằng DIEMDOI từ hệ tọa độ của thằng DTs về hệ tọa độ World nữa bác ạ. Nếu không tuy nó sẽ chạy tương đối giống cái bác muốn nhưng thực tề sẽ là bị tịnh tiến đi một vectơ bàng vecto xác định điểm chèn của block DTs trong hệ tọa độ World bác ạ. Chính vì thế mà bác G288 xài cái lệnh TRANS đó.

Nếu bác không muốn xài cái hàm trans thì bác chơi kiểu củ chuối của mình thử coi nhé.

Chúc bác vui và luôn nhớ tới miền Nam bác nhé. Hì hì.

  • 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
q288    164
Bác nào biết trả lời em vấn đề naỳ với: Trong quá trình làm việc trên cad em phải load nhiều list, cho nên sẽ có những lúc các tham số hay biển của một số list trùng nhau mà vẫn tồn tại sau khi kết thúc lệnh. Làm sai lệch kết quả hay list thực hiện sau bị lỗi, vậy có cách nào xóa hết thông tin sau khi thực hiện xong một lệnh của list không; Hiện giờ em có 1 file xxxxx.lsp tổng hợp rất nhiều list trong đó, để đọc và tìm ra những biển cục bộ (biến địa phương) rất mất công với lại "Trình" list của em còn non nên ko dám đụng vào (sợ làm hỏng list). Mong các bác chỉ dùm cách.

 

Bạn để ý thấy khi khai báo hàm hay lệnh có dạng như sau:

 

(defun c:ten_lenh(/ a b c )

hoặc

(defun ten_ham(doiso1 doiso2 / a b c)

 

dấu / là dùng để xoá các biến đi sau nó (ở đây là các biến a b c) sau khi ra khỏi lệnh hoặc hàm.

 

Trong hàm của bạn chỗ nào có dùng setq Td : (setq a ...) (setq b ...) thì bạn nên đưa hết các biến đó

vào sau dấu / để xóa đi (trừ trường hợp bạn muốn lưu biến đó để dùng cho hàm khác)

  • 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
q288    164
Cho Thiep hỏi:

Có đoạn lisp nào dùng để mở 1 hay nhiều file DWG đang tồn tại không? Tôi đọc trên Help, có nói đến phương thức OPEN trong 1 đoạn mã VBA ví dụ như sau:

 

Sub Example_Open()

' The following example opens "C:\AutoCAD\Sample\city map.dwg" file.

' This drawing may not exist on your system. Change the drawing

' path and name to reflect a valid AutoCAD drawing on your system.

 

ThisDrawing.Application.Documents.Open ("C:\AutoCAD\Sample\city map.dwg")

 

End Sub

Thiep chịu bó tay, không hiểu làm sao để chuyển qua mã VL được. Nhờ các anh em chỉ giáo

Bạn chuyển qua VL như sau:

 

(setq file (vla-Open (vla-get-Documents (vlax-get-acad-object)) "C:\AutoCAD\Sample\city map.dwg"))

Khi đó file đã mở nhưng chưa phải là file hiện hành, bạn thêm

(vla-Activate file)

thì file đó mới trở thành file hiện hành.

 

Giữa VBA và VL có các tên hàm như nhau, chỉ khác VL thêm VLA- (nếu là methods)

hoặc VLA-GET- (nếu là properties) đằng trước:

 

Open -> vla-Open

Documents -> vla-get-Documents

  • 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
duy782006    1.374
Chào bác Duy, bác co khỏe không ạ?

Đọc cái lisp bác post thì thấy cái giải pháp của bác G288 là khá ổn. Mình tuy còn phải mót dài dài nhưng xin phép bác múa rìu qua mắt thợ chút xíu.

Theo mình thì cái mắc chính là ở cái hàm (command "ucs" "ob" DTs). Khi đó bản vẽ được chuyển về hệ tọa độ đặt tại điểm chèn của block DTs. Cái DIEMDOI của bác được xác định theo hệ tọa độ này và do vậy cái hàm (command "move" DTs "" (list 0 0) DIEMDOI) của bác nó chạy ngon trớt.

Trong khi đó cái thằng DTMs của bác được xác định bởi hàm entget mà cái hàm này theo mình hiểu là nó luôn trả về các tọa độ được tính trong hệ tọa độ World, bất kể bác đang ngồi ở đâu.( Thực tế trong lisp này thì cái thằng DTMs của bác được xác định khi bác đang chồm hổm ở (command "ucs" "p") ) Do vậy để có thể xài cái hàm (setq DTMs (subst (cons 10 DIEMDOI) (assoc 10 DTMs) DTMs)), ngoài việc bác phải trả về hệ tọa độ World , bác còn phải chuẩn lại cái thằng DIEMDOI từ hệ tọa độ của thằng DTs về hệ tọa độ World nữa bác ạ. Nếu không tuy nó sẽ chạy tương đối giống cái bác muốn nhưng thực tề sẽ là bị tịnh tiến đi một vectơ bàng vecto xác định điểm chèn của block DTs trong hệ tọa độ World bác ạ. Chính vì thế mà bác G288 xài cái lệnh TRANS đó.

Nếu bác không muốn xài cái hàm trans thì bác chơi kiểu củ chuối của mình thử coi nhé.

Chúc bác vui và luôn nhớ tới miền Nam bác nhé. Hì hì.

Hàm TRANS đã giải quyết gọn gàng sạch sẽ vấn đề rồi. Em chỉ né không xài các hàm vl 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
thiep    263
Bạn chuyển qua VL như sau:

 

(setq file (vla-Open (vla-get-Documents (vlax-get-acad-object)) "C:\AutoCAD\Sample\city map.dwg"))

Khi đó file đã mở nhưng chưa phải là file hiện hành, bạn thêm

(vla-Activate file)

thì file đó mới trở thành file hiện hành.

 

Theo sự hướng dẫn của q288, thiep vẫn chưa mở file được, đoạn mã viết như sau:

(defun C:openfile ()
 (setq	actDoc (vla-get-ActiveDocument
	 (vlax-get-acad-object)
       )
 )
 (setq file (vla-Open
   actDoc
   ("C:\Program Files\AutoCAD 2007\Sample\Lineweights.dwg")
 )
 )
 (vla-Activate file)
)

Xin g288 chỉ giáo thê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
gia_bach    1.442
Theo sự hướng dẫn của q288, thiep vẫn chưa mở file được, đoạn mã viết như sau:

(defun C:openfile ()
 (setq	actDoc (vla-get-ActiveDocument
	 (vlax-get-acad-object)
       )
 )
 (setq file (vla-Open
   actDoc
   ("C:\Program Files\AutoCAD 2007\Sample\Lineweights.dwg")
 )
 )
 (vla-Activate file)
)

Xin g288 chỉ giáo thêm.

Chào thiep

Bạn copy&paste vào command line:

(vla-open (vla-get-documents (vlax-get-acad-object)) "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg")

Hay

(defun c:openFile ()
 (vl-load-com)
 (setq docs-coll (vla-get-Documents (vlax-get-acad-object)))
 ; open hop thoai Select File
 (setq file-to-open (getfiled "FILE TO OPEN"  ""  "dwg" 16))
 ;(setq file-to-open "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg")
 (setq file-opened ( vla-open docs-coll file-to-open))
 (vla-activate file-opened)
 )

  • 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
q288    164
Theo sự hướng dẫn của q288, thiep vẫn chưa mở file được, đoạn mã viết như sau:

(defun C:openfile ()
 (setq	actDoc (vla-get-ActiveDocument
	 (vlax-get-acad-object)
       )
 )
 (setq file (vla-Open
   actDoc
   ("C:\Program Files\AutoCAD 2007\Sample\Lineweights.dwg")
 )
 )
 (vla-Activate file)
)

Xin g288 chỉ giáo thêm.

không phải là vla-get-ActiveDocument vì ActiveDocument là bản vẽ hiện hành, còn vla-get-Documents quản lý tất cả các bản vẽ,

chỉ có Documents mới có quyền gọi bản vẽ mới thôi chứ bản vẽ này đâu có quyền gọi bản vẽ khác.

Hai cái đó là 2 object riêng biệt.

  • 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
shinnikel    1

22.jpgMình quên nói là khoảng cách P tùy y lisp sẽ tính toán con sô hơp lý :lol2: .

 

;┌───────────────────────────┐

;│1991/09/12 新日軽(株)小矢部工場 │

;│ OM設計課 野口 敏章 │

;│ CW ピッチ計算 LISP │

;└───────────────────────────┘

(defun c:snc_keisan01 ()

; *** ユーザーにL,A,Pの入力を求める。 ***

(setq echo (getvar "cmdecho"))

(setvar "cmdecho" 0)

(setq leng (getreal "\nNhap kthuoc L: "))

(setq flag T)

(while flag

(setq tanbu (getstring "\nNhap kthuoc [A]。(muon A co dinh thi nhap them k truoc A): "))

(if (wcmatch (substr tanbu 1 1) "#")

(if (/= (setq tanbu (atof tanbu)) 0) (setq flag nil))

(if (or (= (substr tanbu 1 1) "k") (= (substr tanbu 1 1) "K")) (progn (setq tanbu (atof (substr tanbu 2 (1- (strlen tanbu))))) (setq kotei "tan") (setq flag nil)))

)

)

(setq flag T)

(while flag

(if (= kotei nil)

(setq pitch (getstring "\nNhap buoc nhay (P)。(muon P co dinh thi nhap them k truoc P): "))

(setq pitch (getstring "\nNhap buoc nhay (P)。: "))

)

(if (wcmatch (substr pitch 1 1) "#")

(if (/= (setq pitch (atof pitch)) 0) (setq flag nil))

(if (/= kotei "tan") (if (or (= (substr pitch 1 1) "k") (= (substr pitch 1 1) "K")) (progn (setq pitch (atof (substr pitch 2 (1- (strlen pitch))))) (setq kotei "pit") (setq flag nil))))

)

)

 

; *** 端部側固定の場合の計算 ***

(if (= kotei "tan")

(progn

;(setq n (fix (/ (- leng (* 2.0 tanbu)) pitch)))

(setq n (fix (+ (/ (- leng (* 2.0 tanbu)) pitch) 0.95))) ;二捨三入

;(setq n (fix (+ (/ (- leng (* 2.0 tanbu)) pitch) 0.5))) ;四捨五入

(setq pitch (/ (- leng (* 2.0 tanbu)) n))

)

)

 

; *** ピッチ側固定の場合の計算 ***

(if (= kotei "pit")

(progn

;(setq n (fix (/ (- leng (* 2.0 tanbu)) pitch)))

(setq n (fix (+ (/ (- leng (* 2.0 tanbu)) pitch) 0.95))) ;二捨三入

;(setq n (fix (+ (/ (- leng (* 2.0 tanbu)) pitch) 0.5))) ;四捨五入

(setq tanbu (/ (- leng (* n pitch)) 2.0))

)

)

 

 

; *** 固定なしの場合の計算 ***

(if (and (/= kotei "pit") (/= kotei "tan"))

(progn

;(setq n (fix (/ (- leng (* 2.0 tanbu)) pitch)))

(setq n (fix (+ (/ (- leng (* 2.0 tanbu)) pitch) 0.95))) ;0.05捨0.06入

;(setq n (fix (+ (/ (- leng (* 2.0 tanbu)) pitch) 0.5))) ;四捨五入

(setq pitch (* (fix (/ (/ (- leng (* tanbu 2.0)) n) 10.0)) 10.0))

(setq tanbu (/ (- leng (* pitch n)) 2.0))

)

)

 

; *** 計算結果の表示 ***

(setq hyouji (strcat "\nKET QUA: < " (rtos leng) "=" (rtos tanbu) "+" (rtos pitch 2 1) "×" (rtos n) "+" (rtos tanbu) " > OK chua? chua thi tinh lai! "))

(princ hyouji)

; *** メモリの開放 ***

(setvar "cmdecho" echo)

(setq pitch nil tanbu nil leng nil n nil hyouji nil flag nil kotei nil echo nil)

)

 

; *** エラー処理 ***

(defun *error* (emsg)

(setq pitch nil tanbu nil leng nil n nil hyouji nil flag nil kotei nil echo nil)

(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
thiep    263
không phải là vla-get-ActiveDocument vì ActiveDocument là bản vẽ hiện hành, còn vla-get-Documents quản lý tất cả các bản vẽ,

chỉ có Documents mới có quyền gọi bản vẽ mới thôi chứ bản vẽ này đâu có quyền gọi bản vẽ khác.

Hai cái đó là 2 object riêng biệt.

Xin lỗi, Tôi bỏ Active nhưng vẫn báo lỗi:

error: ActiveX Server returned the error: unknown name: Document

Lisp được viết lại như sau:

(defun C:openfile	()
 (setq	actDoc (vla-get-Document
	 (vlax-get-acad-object)
       )
 )
 (setq file-opened (vla-open docs-coll "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg"))
 (vla-activate file-opened)
)

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
thiep    263
Chào thiep

Bạn copy&paste vào command line:

(vla-open (vla-get-documents (vlax-get-acad-object)) "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg")

Hay

(defun c:openFile ()
 (vl-load-com)
 (setq docs-coll (vla-get-Documents (vlax-get-acad-object)))
 ; open hop thoai Select File
 (setq file-to-open (getfiled "FILE TO OPEN"  ""  "dwg" 16))
 ;(setq file-to-open "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg")
 (setq file-opened ( vla-open docs-coll file-to-open))
 (vla-activate file-opened)
 )

Gia_bach, cám ơn bạn.

khi copy&paste vào command line, thì lệnh OK ngay, tuy nhiên bản vẽ chưa hiện hành

Nhưng khi tạo Lisp thì báo lỗi:

error: Automation Error. Invalid execution context

???

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
q288    164
Xin lỗi, Tôi bỏ Active nhưng vẫn báo lỗi:

error: ActiveX Server returned the error: unknown name: Document

Lisp được viết lại như sau:

(defun C:openfile	()
 (setq	actDoc (vla-get-Document
	 (vlax-get-acad-object)
       )
 )
 (setq file-opened (vla-open docs-coll "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg"))
 (vla-activate file-opened)
)

Documents có s, bạn copy dưới đây :

 

(defun C:openfile ()

(setq docs-coll (vla-get-Documents

(vlax-get-acad-object)

)

)

(setq file-opened (vla-open docs-coll "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg"))

(vla-activate file-opened)

)

  • 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
thiep    263
Documents có s, bạn copy dưới đây :

 

(defun C:openfile ()

(setq docs-coll (vla-get-Documents

(vlax-get-acad-object)

)

)

(setq file-opened (vla-open docs-coll "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg"))

(vla-activate file-opened)

)

Q288, cảm ơn bạn.

Thật là đôi khi cũng ngớ ngẩn vì một 1 lỗi nhỏ mà cũng không phát hiện ra.

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
Tri    24

Chào các bác trên diễn đàn

Các bác cho em hỏi một chút :

Đây là đoạn Code để chuyển 1 tập đối tượng chọn thành List.

Đọc Code em đã hiểu nhưng còn thắc mắc 1 chổ. Mong mọi người chỉ giúp em

 

;;;-----------------------------------------------------

(defun ss2ent (ss / i Le e) ;;;Convert ss to list of ename

(setq i 0)

(repeat (sslength ss)

(setq

e (ssname ss i)

Le (append Le (list e))

i (1+ i)

)

)

Le

)

;;;-----------------------------------------------------

 

Đó là biến Le dòng màu đỏ. Tại sao lại có biến này nằm ở đây?

Và nó có ý nghĩa, tác dụng gì vậy?

Mong mọi người chỉ dùm em.

Em xin chân thành 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
q288    164
Chào các bác trên diễn đàn

Các bác cho em hỏi một chút :

Đây là đoạn Code để chuyển 1 tập đối tượng chọn thành List.

Đọc Code em đã hiểu nhưng còn thắc mắc 1 chổ. Mong mọi người chỉ giúp em

 

;;;-----------------------------------------------------

(defun ss2ent (ss / i Le e) ;;;Convert ss to list of ename

(setq i 0)

(repeat (sslength ss)

(setq

e (ssname ss i)

Le (append Le (list e))

i (1+ i)

)

)

Le

)

;;;-----------------------------------------------------

 

Đó là biến Le dòng màu đỏ. Tại sao lại có biến này nằm ở đây?

Và nó có ý nghĩa, tác dụng gì vậy?

Mong mọi người chỉ dùm em.

Em xin chân thành cảm ơn

 

Đó là giá trị trả về của hàm, các hàm khác sẽ nhận giá trị đó để làm tiếp công việc khác.

Td : (setq List_cac_doi_tuong (ss2ent ss))

 

Thông thường thì nó nằm ở cuối hàm trước dấu ) cuối cùng.

  • 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
VoHoan    8

Các bác cho em hỏi làm cách nào để vẽ được 1 đường Pline đi qua 1 tập hợp điểm cho bởi danh sách "lstdiem" n phần tử. Mở rộng ra là cách xây dựng 1 đối tượng của Cad bằng list?Mong được các bắc giú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
q288    164
Các bác cho em hỏi làm cách nào để vẽ được 1 đường Pline đi qua 1 tập hợp điểm cho bởi danh sách "lstdiem" n phần tử. Mở rộng ra là cách xây dựng 1 đối tượng của Cad bằng list?Mong được các bắc giúp!

 

Bạn dùng kiểu như sau:

 

(command "pline")

(foreach i lstdiem (command i))

(command "")

 

Cách này nhìn không có vẻ "bác học" lắm như kết quả thì ok.

  • Vote tăng 2

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
Tri    24
Đó là giá trị trả về của hàm, các hàm khác sẽ nhận giá trị đó để làm tiếp công việc khác.

Td : (setq List_cac_doi_tuong (ss2ent ss))

 

Thông thường thì nó nằm ở cuối hàm trước dấu ) cuối cùng.

Chào anh q288

Như vậy thì gọi chương trình con ss2ent thì kết quả sẽ trả về cái biến Le này phải không anh?

Như vậy biến Le nó đóng vai trò là kết quả của chương trình con -> Khi chương trình chính gọi nó thì nó trả về kết quả này phải không anh?

Em nói lủng củng quá. Vì em đang học Lisp nên rất cần những thông tin này. Anh trả lời hộ em câu này nhé.

Cảm ơn anh q288 và mọi ngườ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
q288    164
Chào anh q288

Như vậy thì gọi chương trình con ss2ent thì kết quả sẽ trả về cái biến Le này phải không anh?

Như vậy biến Le nó đóng vai trò là kết quả của chương trình con -> Khi chương trình chính gọi nó thì nó trả về kết quả này phải không anh?

Em nói lủng củng quá. Vì em đang học Lisp nên rất cần những thông tin này. Anh trả lời hộ em câu này nhé.

Cảm ơn anh q288 và mọi người

 

Đúng rồi, muốn hàm con trả về cái gì thì để biến đó ở cuối hàm giống như Le ở trên 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
Tue_NV    3.841

Chào mọi người

Tue_NV có câu hỏi này mọi người trên diễn đàn

Mình muốn hỏi về hàm entmake

-> Mình muốn xuất chữ có kiểu canh lề là Midle Center

Nhưng không hiểu sao chạy Lisp thì nó cứ chèn điểm chèn Text về lại toạ độ 0,0,0.

Mình không hiểu tại sao nữa. Mong mọi người chỉ giúp.

 

(defun c:xchu()

(setq p (getpoint))

(setq chu "123456")

(setq caochu 30)

(entmake (list (cons 0 "TEXT") (cons 1 chu) (cons 10 p) (cons 40 caochu) (cons 72 1) (cons 73 2)))

(princ)

)

 

Khi chạy Lisp Text được chèn tại toạ độ 0,0,0. Mình muốn chèn Text tại điểm chèn p

Mong mọi người trên diễn đàn chỉ giúp.

Tue_NV xin cảm ơn thật 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
thiep    263
Chào mọi người

Tue_NV có câu hỏi này mọi người trên diễn đàn

Mình muốn hỏi về hàm entmake

-> Mình muốn xuất chữ có kiểu canh lề là Midle Center

Nhưng không hiểu sao chạy Lisp thì nó cứ chèn điểm chèn Text về lại toạ độ 0,0,0.

Mình không hiểu tại sao nữa. Mong mọi người chỉ giúp.

 

(defun c:xchu()

(setq p (getpoint))

(setq chu "123456")

(setq caochu 30)

(entmake (list (cons 0 "TEXT") (cons 1 chu) (cons 10 p) (cons 40 caochu) (cons 72 1) (cons 73 2)))

(princ)

)

 

Khi chạy Lisp Text được chèn tại toạ độ 0,0,0. Mình muốn chèn Text tại điểm chèn p

Mong mọi người trên diễn đàn chỉ giúp.

Tue_NV xin cảm ơn thật nhiều

(cons 72 22)

  • 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
Tue_NV    3.841
(cons 72 22)

Cảm ơn Thiep. Mình đã thay (cons 72 2) thành (cons 72 22)

-> Kết quả là trên màn hình xuất hiện 2 điểm chèn :

1 điểm nằm ở toạ độ 0,0,0. Một điểm canh lề text ngay vị trí Text

Mình cũng không hiểu là do đâu? Nếu mình thay đổi cái điểm chèn ngay toạ độ 0,0,0 thì Text sẽ thay đổi ngay.

Mình muốn như cái Text canh lề Middle Center như bình thường, không hề muốn xuất hiện cái điểm chèn 0,0,0

 

Đây là Code sửa lại theo ý bạn Thiep nhưng kết quả không như ý vì lí do trên :

 

(defun c:xchu()

(setq p (getpoint))

(setq chu "123456")

(setq caochu 30)

(entmake (list (cons 0 "TEXT") (cons 1 chu) (cons 10 p) (cons 40 caochu) (cons 72 22) (cons 73 2)))

(princ)

)

Mong mọi người chỉ giúp cho Tue_NV

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

Tue_NV có câu hỏi này mọi người trên diễn đàn

Mình muốn hỏi về hàm entmake

-> Mình muốn xuất chữ có kiểu canh lề là Midle Center

Nhưng không hiểu sao chạy Lisp thì nó cứ chèn điểm chèn Text về lại toạ độ 0,0,0.

Mình không hiểu tại sao nữa. Mong mọi người chỉ giúp.

 

(defun c:xchu()

(setq p (getpoint))

(setq chu "123456")

(setq caochu 30)

(entmake (list (cons 0 "TEXT") (cons 1 chu) (cons 10 p) (cons 40 caochu) (cons 72 1) (cons 73 2)))

(princ)

)

 

Khi chạy Lisp Text được chèn tại toạ độ 0,0,0. Mình muốn chèn Text tại điểm chèn p

Mong mọi người trên diễn đàn chỉ giúp.

Tue_NV xin cảm ơn thật nhiều

 

Bạn thêm (cons 11 p) nữa. Vì chỉ có align Left là dùng dxf code 10 thôi (code 11 khi đó là '(0 0 0))

còn các align khác thì code 11 là chính còn 10 là phụ.

Bạn cứ cho cả 2 code 10 và 11 bằng p hết đi, cad sẽ tự động tính lại code 10.

  • Vote tăng 2

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


×