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ị

Mình học từ bác Hoành đấy, trước đây cũng có ng hỏi, và bác H trả lời rồi, phải chuyển lời cám ơn cho bác Hoành.

Hàm eval cho ra giá trị thực của biến đứng sau

Hàm read cho ra phần tử đầu của chuỗi đứng sau, tức là nếu chuỗi có dấu cách thì chỉ lấy 1 từ đứng trước thôi.

Tài liệu thì đọc help thôi, chỉ cần tiếng anh sơ sơ cũng đọc đc mà, tốt nhất là đọc các ví dụ.

ôi, thế thì cho mình chuyển nhời cám ơn bác Hoành nhé.

thank nhiều 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

ccác bác xem giùm mình, tại sao máy mình lại chạy cái này bị lỗi (điểm 2 3 trùng nhau)?????

 

(command "pline" '(2989 3573 0) '(2989 4173 0) '(2969 4201 0) '(2969

8173 0) "")

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
ccác bác xem giùm mình, tại sao máy mình lại chạy cái này bị lỗi (điểm 2 3 trùng nhau)?????

 

(command "pline" '(2989 3573 0) '(2989 4173 0) '(2969 4201 0) '(2969

8173 0) "")

Bạn phải tắt osnap đi trước khi dùng hàm command.

 

Bạn search trên diễn đàn từ (setvar "osmode" 0) để có thêm ví dụ.

  • 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
Bạn phải tắt osnap đi trước khi dùng hàm command.

 

Bạn search trên diễn đàn từ (setvar "osmode" 0) để có thêm ví dụ.

đề nghị diễn đàn cho thank nhiều hơn nữa. chứ thank có 1 lần chưa đã.

càm ơn bác Nguyễn Hòanh nhiều nhiều ..... 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
đề nghị diễn đàn cho thank nhiều hơn nữa. chứ thank có 1 lần chưa đã.

càm ơn bác Nguyễn Hòanh nhiều nhiều ..... nhá

hì, sao bạn lại ko biết osmod nhỉ,...đây là điều căn bản trước nhất để cad chạy lip đấ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
hì, sao bạn lại ko biết osmod nhỉ,...đây là điều căn bản trước nhất để cad chạy lip đấy.

hề hề,

cái này tớ vừa học, vừa thực hiện vừa làm một cái lisp cho riêng mình. điều này sẽ gặp một số bất cập trong thực hiện, nhưng nhờ đó, việc tìm hiểu về lisp sẽ sâu hơn trong bản chất của vấn đề.

còn cái osmode này tớ có thấy ai chỉ quái gì đâu.

tuy nhiên tớ cũng thấy thắc mắc 1 điều : tại sao mình nhập tọa độ chính xác, chế độ bắt điểm vẫn thực hiện như mình vẽ bằng chuột nhỉ??????

cái này cũng đã thử rồi, khi zoom to lên thì kg bị (i chang như trường hợp bắt điểm khi dùng chuột)

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 mình hỏi:

trong lisp có thực hiện được việc insert 1 block từ file khác vào và hiệu chỉnh được attribute của block này hay kg?

mình thấy trong cad, khi insert block có attribute nó sẽ hỏi giá trị ngay,

vậy lisp có thể không cho xuất hiện bảng nhập giá trị, chỉ nhập theo các giá trị được tính tóan trong lisp , được kg?????

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 mình hỏi:

trong lisp có thực hiện được việc insert 1 block từ file khác vào và hiệu chỉnh được attribute của block này hay kg?

mình thấy trong cad, khi insert block có attribute nó sẽ hỏi giá trị ngay,

vậy lisp có thể không cho xuất hiện bảng nhập giá trị, chỉ nhập theo các giá trị được tính tóan trong lisp , được kg?????

Vẫn bình thường như nhập bằng tay.

 

Trước hết, bạn phải set biến hệ thống ATTDIA về 0 sau đó thì dùng lệnh command như bình thườ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
Vẫn bình thường như nhập bằng tay.

 

Trước hết, bạn phải set biến hệ thống ATTDIA về 0 sau đó thì dùng lệnh command như bình thường.

ôi, cám ơn bác Nguyễn Hoanh nhiều. mình cứ vừa học, vừa tự làm cái lisp hơi khủng nên bối rối. nếu có gì "gà" quá, xin bỏ qua nhé

cám ơn lần 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

Mình có cái Lisp để copy file test.lsp từ thư mục này sang thư mục khác, nhưng nếu copy vào c:\ thì được , còn copy vào c:\Program Files\AutoCAD 2004\Support thì không được. Xin mọi chỉ giúp.

 

(defun c:chep()

(command "SHELL" "copy d:\\test.lsp C:\\Program Files\\AutoCAD 2004\\Support")

(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
Mình có cái Lisp để copy file test.lsp từ thư mục này sang thư mục khác, nhưng nếu copy vào c:\ thì được , còn copy vào c:\Program Files\AutoCAD 2004\Support thì không được. Xin mọi chỉ giúp.

 

(defun c:chep()

(command "SHELL" "copy d:\\test.lsp C:\\Program Files\\AutoCAD 2004\\Support")

(princ))

Shell là cầu cứu tới dos rồi mà nó thì không chịu khoảng 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
Mình có cái Lisp để copy file test.lsp từ thư mục này sang thư mục khác, nhưng nếu copy vào c:\ thì được , còn copy vào c:\Program Files\AutoCAD 2004\Support thì không được. Xin mọi chỉ giúp.

 

(defun c:chep()

(command "SHELL" "copy d:\\test.lsp C:\\Program Files\\AutoCAD 2004\\Support")

(princ))

 

Bạn dùng hàm vl-file-copy hay hơn.

 

(vl-load-com)

(vl-file-copy "d:/test.lsp" "C:/Program Files/AutoCAD 2004/Support/test.lsp")

  • 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
Shell là cầu cứu tới dos rồi mà nó thì không chịu khoảng hở.

 

Em đã bỏ hết khoảng hở rồi mà cũng không copy được, em đã thử thay đổi đường dẫn ví dụ sang thư mục d:\tuan thì được. Hình như nó không chịu copy tất cả những gì vào c:\Program Files thì phả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
Bạn dùng hàm vl-file-copy hay hơn.

 

(vl-load-com)

(vl-file-copy "d:/test.lsp" "C:/Program Files/AutoCAD 2004/Support/test.lsp")

 

Mình làm được rồi.

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

Nếu bác biết về cách tạo file.bat thì cho mình hỏi thêm 1 chút.

Mình cũng thử copy bằng kiểu tạo file.bat dưới đây nhưng không được, không biết làm sai chỗ nào.

 

@echo off

copy d:\test.lsp C:\Program Files\AutoCAD 2004\Support

 

Nếu mình copy vào thưc mục khác C:\Program Files thì vẫn copy được.

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
Em đã bỏ hết khoảng hở rồi mà cũng không copy được, em đã thử thay đổi đường dẫn ví dụ sang thư mục d:\tuan thì được. Hình như nó không chịu copy tất cả những gì vào c:\Program Files thì phải.

Thế theo bạn giữa chử Program và chử Files không phải khoảng hở thì nó là cái gì vậy :s_big:

  • 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 làm được rồi.

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

Nếu bác biết về cách tạo file.bat thì cho mình hỏi thêm 1 chút.

Mình cũng thử copy bằng kiểu tạo file.bat dưới đây nhưng không được, không biết làm sai chỗ nào.

 

@echo off

copy d:\test.lsp C:\Program Files\AutoCAD 2004\Support

 

Nếu mình copy vào thưc mục khác C:\Program Files thì vẫn copy được.

Chào tuan_thietkedien

Dos chỉ hiểu tên file & folder 8 kí tự.

Truờng hợp tên file(folder) dài hơn 8, DOS sẽ tự động cắt phần sau từ kí tự thứ 7 rồi thêm "~1" hoặc "~2" phía sau 6 kí tự phía đầu.

VD : Program Files -> Progra~1

AutoCAD 2004 -> Autoca~1

do đó bạn thử sửa file bat nhu sau :

 

@echo off

copy d:\test.lsp C:\Progra~1\AutoCA~1\Support

 

Chúc thành công.

  • 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
Thế theo bạn giữa chử Program và chử Files không phải khoảng hở thì nó là cái gì vậy :s_big:

 

Hihi, Ý em là đã sữa lại lisp thành như bên dưới, đã bỏ khoảng trống rồi

(command "SHELL" "copy d:\\test.lsp C:\\ProgramFiles\\AutoCAD2004\\Support")

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 tuan_thietkedien

Dos chỉ hiểu tên file & folder 8 kí tự.

Truờng hợp tên file(folder) dài hơn 8, DOS sẽ tự động cắt phần sau từ kí tự thứ 7 rồi thêm "~1" hoặc "~2" phía sau 6 kí tự phía đầu.

VD : Program Files -> Progra~1

AutoCAD 2004 -> Autoca~1

do đó bạn thử sửa file bat nhu sau :

 

@echo off

copy d:\test.lsp C:\Progra~1\AutoCA~1\Support

 

Chúc thành công.

 

Hihi, cám ơn bác gia bach nhiều lắm.

Em làm được 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
Chào tuan_thietkedien

Dos chỉ hiểu tên file & folder 8 kí tự.

Truờng hợp tên file(folder) dài hơn 8, DOS sẽ tự động cắt phần sau từ kí tự thứ 7 rồi thêm "~1" hoặc "~2" phía sau 6 kí tự phía đầu.

VD : Program Files -> Progra~1

AutoCAD 2004 -> Autoca~1

do đó bạn thử sửa file bat nhu sau :

 

@echo off

copy d:\test.lsp C:\Progra~1\AutoCA~1\Support

 

Chúc thành công.

 

Việc này mình cũng đã từng woánh lộn với nó 1 thời gia nhưng giờ bỏ rồi vì làm theo cách C:\Progra~1\AutoCA~1\Support thì không phải lúc nào cũng đúng vì trường hợp máy có cài 2 cad thì sao mà khi không chắc chăc đúng thì không nên đi theo.

 

Hihi, Ý em là đã sữa lại lisp thành như bên dưới, đã bỏ khoảng trống rồi

(command "SHELL" "copy d:\\test.lsp C:\\ProgramFiles\\AutoCAD2004\\Support")

 

Lúc này thì phải có thư mục C:\\ProgramFiles\\AutoCAD2004\\Support tại đúng vị trí của nó thì mới được chứ bạn.

 

Mình nhớ hồi bị vướng mình làm như vầy bạn thử xem:

 

(command "SHELL" "copy d:\\test.lsp \\Support")

Lúc này thì phía trước \\Support nó hiểu là thư mục cài đặt cad bạn đang dùng thì phải.

  • 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
Việc này mình cũng đã từng woánh lộn với nó 1 thời gia nhưng giờ bỏ rồi vì làm theo cách C:\Progra~1\AutoCA~1\Support thì không phải lúc nào cũng đúng vì trường hợp máy có cài 2 cad thì sao mà khi không chắc chăc đúng thì không nên đi theo.

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

Chào duy782006

Trong truờng hợp có nhiều thư mục dài hơn 8 kí tự và có 6 kí tự đầu giống nhau.

VD: AutoCAD 2004, AutoCAD 2007 , AutoCAD 2008

DOS sẽ hiểu thư mục nào đuợc tạo truớc là AutoCA~1, kế đó lần luợt là AutoCA~2, AutoCA~3 ....

 

trường hợp máy có cài 2 cad thì thư mục Cad cài truớc sẽ là AutoCA~1 và thư mục Cad cài sau sẽ là AutoCA~2.

  • 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
Chào duy782006

Trong truờng hợp có nhiều thư mục dài hơn 8 kí tự và có 6 kí tự đầu giống nhau.

VD: AutoCAD 2004, AutoCAD 2007 , AutoCAD 2008

DOS sẽ hiểu thư mục nào đuợc tạo truớc là AutoCA~1, kế đó lần luợt là AutoCA~2, AutoCA~3 ....

 

trường hợp máy có cài 2 cad thì thư mục Cad cài truớc sẽ là AutoCA~1 và thư mục Cad cài sau sẽ là AutoCA~2.

Chào anh Duy và chào bạn TuanThietkedien

Ý kiến của anh giabach hoàn toàn đúng

 

Nói một cách khác, DOS sẽ hiểu thư mục cài trước và thư mục nào cài sau qua thời gian tạo ra nó (Date Modiifed)

Bạn muốn xem thời gian tạo ra file hay folder thì bạn hãy để chế độ Xem Detail -> Ở nhãn Date Modiifed (tab thứ 4 từ trái qua phải) (có 4 Tab : Name, Size, Type và Date Modiifed). Cái này cũng có thể vào trực tiếp DOS để xem

 

Mình lấy thêm Ví dụ như có 2 thư mục:

D:\Program Files tạo trước

D:\Program Field tạo sau

 

Thế thì copy d:\Text.lsp vào 2 thư mục này như sau

copy d:\test.lsp D:\Progra~1 (copy vào D:\Program Files)

copy d:\test.lsp D:\Progra~2 (copy vào D:\Program Field)

  • 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 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 (< L M)

(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 <" TENKHOI "> :" (itoa L) " doi tuong"))

 

(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
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?

không phải tại (command "ucs" "ob" doituong1) mà do bạn chưa chuyển DIEMDOI về ucs cũ, trước đó bạn phải dùng hàm trans

để chuyển nó về , cụ thể là:

(setq DIEMDOI (trans DIEMDOI 1 0))

rồi mới

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

(entmod DTMs)

  • 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
không phải tại (command "ucs" "ob" doituong1) mà do bạn chưa chuyển DIEMDOI về ucs cũ, trước đó bạn phải dùng hàm trans

để chuyển nó về , cụ thể là:

(setq DIEMDOI (trans DIEMDOI 1 0))

rồi mới

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

(entmod DTMs)

bạn có thể giải thích thêm cho mình về tham số 1 và 0 được không. Mình chưa đọc thấy thèn trans bao giờ nên còn lơ mơ lắm :lol2:

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 có thể giải thích thêm cho mình về tham số 1 và 0 được không. Mình chưa đọc thấy thèn trans bao giờ nên còn lơ mơ lắm :lol2:

 

Trans là hàm chuyển đổi tọa độ 1 điểm từ ucs này sang ucs khác.

1 là ucs hiện hành (current UCS), 0 là world ; tức là chuyển toạ độ điểm từ ucs hiện hành về ucs world.

 

Khi bạn dùng lệnh move thì cơ sở dữ liệu tự động cập nhật, còn khi bạn can thiệp trực tiếp vào CSDL bằng entmod thì nó không tự động

, nếu bạn ko dùng trans thì tất cả các block của bạn sẻ bay hết về gần điểm '(0 0).

 

Bạn coi thêm về hàm trans trong help.

  • Vote tăng 4

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

×