Đến nội dung


Hình ảnh
- - - - -

Lisp chạy một lúc thì chạy sai


  • Please log in to reply
3 replies to this topic

#1 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 23 March 2009 - 03:14 PM

Tôi viết một cái lisp để để chỉnh sửa nhiều bản vẽ giống nhau.
Sau khi chạy khoảng vài chục hoặc hơn 100 bản, nó bắt đầu trở chứng. Một số lệnh chọn đối tượng không chạy nữa. Tôi không hiểu vì lý do gì? Hình như nó không giải phóng được bộ nhớ hay sao ấy. Khi xảy ra sự cố sai, Tôi kiểm tra thấy các dòng chọn đối tượng màu đỏ không có tác dụng
(defun dxf( name n)
(cdr (assoc n (entget name)))
)

(defun rakhoimau( / ss kt)
(setq kt nil)
(setq ss (ssget "x" '((0 . "insert") (2 . "mau"))))
(if ss (progn
(command "_.explode" (ssname ss 0))
(setq kt T)
))
kt
)

(defun chensdcd( p / P1 P2)
(SETQ P1 (MAPCAR '+ P '(233.0 3.0 0.0)) P2 (MAPCAR '+ p '(338.0 117.0 0.0)))
(command "_.layer" "off" "ddhsb" "")
(command "_.erase" "c" p1 p2 "")
(command "_.layer" "on" "ddhsb" "")
(command "_.insert" "sodochidan" p1 "" "" "")
)

(defun chuyenchu1( p / p1 p2 p3 ss)
(setq p1 (mapcar '+ p '(378.0 118.0)) p2 (mapcar '+ p '(615.0 137.0)) p3 (mapcar '+ p '(523.0 118.0)))
(command "_.zoom" "w" p1 p2)
(setq ss (ssget "w" p1 p2 '((8 . "ddhsb"))))
(if ss (command "_.move" ss "" p1 p3))
(setq ss nil)
)
(defun chuyenchu2( p / p1 p2 p3 ss ss1 ss2)
(setq p1 (mapcar '+ p '(6.0 434.0)) p2 (mapcar '+ p '(164.0 494.0)))
(command "_.zoom" "w" p1 p2)
(setq p1 (mapcar '+ p '(11.0 465.0)) p2 (mapcar '+ p '(160.0 466.0)))
(setq ss1 (ssget "c" p1 p2 '((0 . "text"))))
(setq p1 (mapcar '+ p '(11.0 473.0)) p2 (mapcar '+ p '(160.0 474.0)))
(setq ss2 (ssget "c" p1 p2 '((0 . "text"))))
(if ss1 (command "_.move" ss1 "" '(0 0 0) '(0 8 0)))
(if ss2 (command "_.move" ss2 "" '(0 8 0) '(0 0 0)))
(setq p1 (mapcar '+ p '(11.0 481.0)) p2 (mapcar '+ p '(160.0 482.0)))
(setq ss (ssget "c" p1 p2 '((0 . "text"))))
(if ss (command "_.erase" ss ""))

(setq p1 (mapcar '+ p '(7.0 440.0)) p2 (mapcar '+ p '(149.0 474.0)))
(setq ss (ssget "c" p1 p2 '((0 . "text"))))
(if ss (command "_.move" ss "" '(0 0 0) '(0 8 0)))
(setq ss nil ss1 nil ss2 nil)
)

(defun chuyenchu3( p / p1 p2 p3 ss ss1 ss2)
(setq p1 (mapcar '+ p '(6.0 434.0)) p2 (mapcar '+ p '(164.0 494.0)))
(command "_.zoom" "w" p1 p2)
(setq p1 (mapcar '+ p '(11.0 441.0)) p2 (mapcar '+ p '(160.0 442.0)))
(setq ss1 (ssget "c" p1 p2 '((0 . "text"))))
(if ss1 (progn
(setq p1 (mapcar '+ p '(11.0 457.0)) p2 (mapcar '+ p '(160.0 458.0)))
(setq ss1 (ssget "c" p1 p2 '((0 . "text"))))
(setq p1 (mapcar '+ p '(11.0 465.0)) p2 (mapcar '+ p '(160.0 466.0)))
(setq ss2 (ssget "c" p1 p2 '((0 . "text"))))
(if ss1 (command "_.move" ss1 "" '(0 0 0) '(0 8 0)))
(if ss2 (command "_.move" ss2 "" '(0 8 0) '(0 0 0)))
(setq p1 (mapcar '+ p '(11.0 473.0)) p2 (mapcar '+ p '(160.0 474.0)))
(setq ss (ssget "c" p1 p2 '((0 . "text"))))
(if ss (command "_.erase" ss ""))
(setq ss nil ss1 nil ss2 nil)
) (chuyenchu2 p))
)

(defun C:XLTTN( / ss n p kt)
(setvar "osmode" 0)
(setq kt (RAKHOIMAU))
(print kt)
(setq ss (ssget "x" '((0 . "lwpolyline") (8 . "ddhsb") (41 . 2))))
(if ss (progn
(setq n (ssname ss 0))
(setq p (dxf n 10) p (list (- (car p) 806) (cadr p) 0.0))
(CHENSDCD p)
(chuyenchu1 p)
(if kt (chuyenchu2 p) (chuyenchu3 p))
(setq ss nil)
))
)
Đây là các file bản vẽ : Tôi chưa up bản vẽ lên được
Bạn nào biết vì lý do gì xin chỉ giúp cho
  • 0

#2 nk_long

nk_long

    biết vẽ line

  • Members
  • PipPip
  • 29 Bài viết
Điểm đánh giá: 14 (tàm tạm)

Đã gửi 23 March 2009 - 03:48 PM

Xin để ý bạn về hàm ssget:
Hàm ssget chỉ nhặt được những đối tượng nằm trong giới hạn thể hiện trên màn hình vẽ của CAD. Nếu đối tượng hoặc các tham số bạn cung cấp để khoanh vùng nhặt đối tượng nằm ngoài giới hạn trên thì hàm không nhặt được.
Bạn nên dùng thêm câu lệnh Zoom để đưa phần cần nhặt thể hiện lên màn hình hoặc chắc nhất là zoom extents một cái và nhớ là tắt truy bắt điểm.

Chúc thành công.
  • 0

#3 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 23 March 2009 - 05:31 PM

Xin để ý bạn về hàm ssget:
Hàm ssget chỉ nhặt được những đối tượng nằm trong giới hạn thể hiện trên màn hình vẽ của CAD. Nếu đối tượng hoặc các tham số bạn cung cấp để khoanh vùng nhặt đối tượng nằm ngoài giới hạn trên thì hàm không nhặt được.
Bạn nên dùng thêm câu lệnh Zoom để đưa phần cần nhặt thể hiện lên màn hình hoặc chắc nhất là zoom extents một cái và nhớ là tắt truy bắt điểm.

Chúc thành công.

Điều này thì tôi cũng biết và tôi đã zoom nó về trong màn hình rồi. Cũng với cái file đó, khi nó bị lỗi chỉ còn cách thoát cad rôi vào lại, chạy ngay thì nó vẫn bình thường, chỉ sau một lúc nó mới lại bị sai. Tôi nghĩ do vần đề về bộ nhớ của cad nhưng tôi chưa biết hàm nào xử lý việc này
Đây là file bản vẽ gốc chưa xử lý : http://www.cadviet.com/upfiles/goc.dwg
Đây là file chạy đúng : http://www.cadviet.c...pfiles/dung.dwg
Đây là file đã chạy sai : http://www.cadviet.com/upfiles/sai.dwg
Đây là file phụ cần cho lúc chạy : http://www.cadviet.c.../sodochidan.dwg
  • 0

#4 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 24 March 2009 - 10:34 AM

Cám ơn các bạn đã quan tâm. Sau khi chạy trên máy khác thì nó vẫn chạy tốt. Mình nghĩ nó bị virus và sau khi diệt virus, nó đã chạy tốt
  • 0