Đế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

#341 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 28 May 2009 - 02:14 PM

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.
  • 2

#342 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

  • Members
  • PipPipPip
  • 153 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 28 May 2009 - 02:38 PM

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")
  • 0

#343 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

  • Members
  • PipPipPip
  • 153 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 28 May 2009 - 02:43 PM

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.
  • 0

#344 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 28 May 2009 - 02:57 PM

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

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


#345 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 28 May 2009 - 03:49 PM

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.
  • 2

#346 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 29 May 2009 - 03:15 AM

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

#347 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 11 June 2009 - 08:26 AM

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))

  • 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


#348 q288

q288

    biết lệnh fillet

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

Đã gửi 11 June 2009 - 09:21 AM

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)
  • 2

#349 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 11 June 2009 - 09:31 AM

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:
  • 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


#350 q288

q288

    biết lệnh fillet

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

Đã gửi 11 June 2009 - 10:03 AM

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.
  • 4

#351 VoHoan

VoHoan

    biết lệnh move

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

Đã gửi 11 June 2009 - 11:50 PM

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.
  • 0

#352 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 12 June 2009 - 10:27 AM

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
  • 0

#353 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 12 June 2009 - 12:15 PM

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))

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ì.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#354 q288

q288

    biết lệnh fillet

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

Đã gửi 12 June 2009 - 12:15 PM

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

#355 q288

q288

    biết lệnh fillet

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

Đã gửi 12 June 2009 - 12:36 PM

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

#356 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 12 June 2009 - 01:39 PM

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.
  • 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


#357 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 12 June 2009 - 03:01 PM

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.
  • 0

#358 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 12 June 2009 - 03:53 PM

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)
)

  • 1

#359 q288

q288

    biết lệnh fillet

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

Đã gửi 12 June 2009 - 04:20 PM

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

#360 shinnikel

shinnikel

    biết vẽ line

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

Đã gửi 12 June 2009 - 05:03 PM

Hình đã gửi Mì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)
)
  • 0