Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
LoveLisp

Lấy đường dẫn của đối tượng Xref bằng Lisp

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

Đối tượng Xref trong AutoCAD có 2 loại đường dẫn, đó là "Saved Path" và "Found Path"

Mình không upload được ảnh, vui lòng xem ở đây: http://postimage.org/image/i3gncfekp/

 

Với "Saved Path", mình có thể lấy bằng câu lệnh sau:

(vla-get-path (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (cdr (assoc 2 (entget (car (entsel)))))))

 

Nhưng với "Found Path" thì chưa có cách nào để lấy được. Có bác nào biết không, giúp mình vớ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

Mình đã thử nhiều cách nhưng có lẽ giá trị này không được lưu vào trong đối tượng Xref. Khi đường dẫn Xref không tìm thấy, AutoCAD tự động tìm kiếm trong các đường dẫn mặc định (bao gồm cả thư mục chứa bản vẽ hiện hành), nếu tìm thấy thì nó sẽ lấy giá trị này vào "Found Path:.

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

Tiếc quá! Tôi cũng chưa biết, chứ nếu biết thì đã chỉ cho bạn.

Hàm này nhìn cái tên thì thấy giống y/c của bạn nhưng không biết có đúng không.

Tôi thử dump 1 xref để tìm nhưng bí.

Hy vọng có người biết sẽ giúp bạn.

  • 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

Có lẽ bạn không nên dùng. vla-get-foundpath là hàm lấy những Foundpath của 1 file, về cơ bản là giống kết quả của hàm findfile với đối số là đường dẫn full, không kèm theo tên file. (Đối số là file vla-object)  Trong bài toán của bạn phải sử dụng FullFileName.

 

Mình chỉ thắc mắc là sao bạn không thử giải pháp đơn giản hơn, dựa trên chính suy luận của bạn ? (và theo hình bạn up - các trường hợp có thể khác chưa tính đến)

- Bước 1 : Get Saved Path

- Bước 2 : Kiểm tra file Saved Path có tồn tại không bằng đường dẫn thực

- Nếu có, đó sẽ là FoundPath, nếu không có, sử dụng hàm (findfile "tên_file_không_kèm_đường_dẫn")

 

Hàm Findfile sẽ tìm kiếm current folder trước, rồi tiếp đến Support Path

 

 

P/s : bài này của bạn mình là người khóa, vì nghĩ rằng bạn tham gia box lisp khá lâu rồi, đủ để biết quá trình mod yêu cầu về quy cách post bài cũng như các mod vất vả như thế nào mỗi lần nhắc nhở thành viên. Mỗi thành viên dù ở 4room nào cũng vậy, cũng nên tập thói quen nhìn trước ngó sau xem mọi người làm thế nào mà theo!

 

Nay chủ trương của 4room đã thay đổi, topic open trở lại, mong bạn thông cảm vì sự bất tiện nà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

@Ketxu: Trong trường hợp xref không nằm trong Current folder hay support path thì không tìm được phải không ketxu?

@LLisp: Found path của đối tượng xref chính là fullfilename. Bạn sử dụng hàm này. xrefname là tên của file xref.

Ví dụ: (get-xref-foundpath "KhungTen.dwg")

(defun get-xref-foundpath (xrefname / foundpath)
(vlax-for xr (vla-get-filedependencies (vla-get-activedocument (vlax-get-acad-object)))
(and (= "Acad:XRef" (vla-get-feature xr))
(= xrefname (vla-get-filename xr))
(setq foundpath (vla-get-fullfilename xr))))
foundpath)

Mình viết qua, chủ yếu để bạn nắm được chỗ cần biết nên sử dụng vlax-for, sẽ chậm nếu bản vẽ có số lượng xref lớn. bạn nên viết lại bằng vla-item lấy từ index của đối tượng sẽ cho tốc độ nhanh hơn.

 

PS: đối số của hàm vla-get-foundpath cũng là depended file như hàm trên của mình nhé. Nhưng nó không có ý nghĩa với xref, chỉ có ý nghĩa với textstyle thôi. Để tìm thư mục chứa font sử dụng trong textstyle

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

Tl : lẽ nào cad nó lại lục hết cả máy tính để tìm file load thì chết ^^

Ps : code trên duyệt tất cả depended file với file hiện hành, gồm cả xref, font, plot style ... nhưng thường k quá lớn nên k vấn đề gì đâ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

Tl đọc k kỹ rồi. cách của bạn ketxu đã gợi ý LL, và thêm cách dùng thuần nữa. còn câu tl hỏi, bạn nghĩ cad nó có thể tự tìm đc found path ở một nơi bất kỳ ư mà hỏi câ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

Cám ơn ketxu đã thông báo vì sao bài viết của mình bị khóa, mình xin lỗi vì đã chưa tuân thủ tốt nội quy của diễn đàn.

 

Thật ra sau 2 lần tạo bài viết, lần đầu bị xóa, lần sau thì bị khóa mà không có bất cứ thông báo nào, mình đã có dự định rời diễn đàn CADViet.

Mình rất không đồng tình cách làm đó. Lẽ ra, các bài vi phạm nên bị chuyển đến thùng rác, nick có thể bị khóa một thời gian hoặc vĩnh viễn, kèm theo lời nhắn (có thể vào thư mục cá nhân) nhưng nhất thiết phải thông báo cho người vi phạm biết, bởi lẽ nếu không biết đã vi phạm gì thì người ta hoàn toàn có thể lặp lại điều tương tự.

 

Mình tham gia và tạo chủ đề tương tự ở đây:

http://www.autolisp.com/forum/threads/814-How-can-I-detect-Xref-path?p=3001#post3001

 

Mình đã nhận được phản hồi và mình thấy hàm (vla-get-foundpath đã được sử dụng. Mình đã thử và thấy rằng nó hoạt động tốt.

Command: TEST
("" "
\\\\192.168.1.250\\backup\\004_Drawings_DD\\12_PKGA4\\REV1 FOR SUBMISSION
130131\\F-Crossing Roads\\H1 Typical Cross Sections\\")

Tuy nhiên mình không rõ tại sao trong kết quả trả về có một chuỗi rỗ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

K được đâu LL ạ. Vì 4room chưa có chức năng lúc khóa thì thông báo (giống như khi warn). Còn nếu mỗi bài sai mod lại ngồi thư tay cho các bạn thì mod không đủ sức đâu ^^ Nếu LL đủ sức thì làm thử cho vui ^^

Ở một bài vi phạm khác, ketxu có giải thích rồi đó : sai = có quyền xóa mà không thông báo, nhất là với các mem ở trên 4room đủ lâu để đọc được ít nhất một lời nhắc tương tự. Còn mem mới ketxu vẫn ngồi nhắc được. Khóa là đủ để các bạn biết nó đã có gì đó sai mà chột dạ nhìn lại xung quanh

Bây giờ thì thôi rồi, các bạn cứ thoải mái ^^

Câu hỏi của bạn đã có bình luận ở diễn đàn của bác Thar, ketxu k dám múa rìu nữa. Gluck Guy^^

  • 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

Làm MOD cho diễn đàn là công việc "làm dâu trăm họ", hoàn toàn không có quyền lợi nào ngoài việc thỏa mãn đam mê của chính mình - mình hiểu rõ điều ấy. Tuy nhiên, nếu không biết vi phạm ở đâu, mình sẵn sàng tạo bài mới nhiều lần (thậm chí lập nhiều nick khác) cho đến khi nhận được thông báo nguyên nhân - cách làm đó chỉ tốn sức cho cả MOD mà MEM mà khi đó diễn đàn đã trở thành nơi spam - điều không thành viên chân chính nào mong muố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

@LL: Vì người trả lời cho bạn cũng không biết rằng foundpath trong depended file của đối tượng xref luôn là 1 chuỗi rỗng. Ngoài các thông tin khác thì trong cấu trúc của 1 depended file có chứa 3 thành phần: FileName, FullFileName và FoundPath.

Với đối tượng Xref thì FullFileName đã chứa đầy đủ đường dẫn rồi. Autodesk gán luôn thông tin này vào mục Foundpath trong hộp thoại Xref (treo đầu dê bán thị chó) dẫn đến hiểu lầm.

Hàm trên mình viết lại tối ưu hơn như sau

(defun get-xref-foundpath (xrefname / foundpath i n)
(setq ss (vla-get-filedependencies (vla-get-activedocument (vlax-get-acad-object))))
(setq n (vlax-get ss 'Count) i 1)
(while (<= i n)
(setq xr (vla-item ss i) i (1+ i))
(and (= "Acad:XRef" (vla-get-feature xr))
(= xrefname (vla-get-filename xr))
(setq foundpath (vla-get-fullfilename xr))
(setq i (1+ n))))
foundpath)
 
  • 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

Cám ơn bạn ThuyLinh. Đối số (get-xref-foundpath xrefname) là gì vậy bạn? Ename, vla-object hay chuỗi tên Xref vậy bạn?

 

xrefname : Đó chính là tên bản vẽ xref của bạn. Nó là 1 string  (Ví dụ : "a.dwg"), của bạn chính là "Khung A3.dwg" (theo hình vẽ bạn post)

  • 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 viết lại hàm cho bạn dễ thấy :

 

 
(defun get-xref-foundpath ( / foundpath i n)
  (setq xrefname (strcat
           (vl-filename-base
              (vla-get-path
               (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                 (cdr (assoc 2 (entget (car (entsel "\nPick vao ban ve Xref :")))))))
            ) ".dwg"
         )
  )
(setq ss (vla-get-filedependencies (vla-get-activedocument (vlax-get-acad-object))))
(setq n (vlax-get ss 'Count) i 1)
(while (<= i n)
(setq xr (vla-item ss i) i (1+ i))
(and (= "Acad:XRef" (vla-get-feature xr))
(= xrefname (vla-get-filename xr))
(setq foundpath (vla-get-fullfilename xr))
(setq i (1+ n))))
foundpath)

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

hihi.. Cám ơn bác Tue_NV nhiều! Dễ hiểu và dễ sử dụng hơn! :)

Nhưng vẫn gặp lỗi:

Command: (get-xref-foundpath)

Pick vao ban ve Xref :; error: Automation Error. Key not found

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

Nó đây, bạn xem giúp mình nhé!

http://www.mediafire.com/?iottw1todzcteuw

 

Sửa lại code, bạn test thử nhé :

 

 
(defun get-xref-foundpath ( / foundpath i n)
  (setq xrefname (strcat
           (vl-filename-base
              (vla-get-path
               (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
                 (cdr (assoc 2 (entget (car (entsel "\nPick vao ban ve Xref :")))))))
            ) ".dwg"
         )
  )
(setq ss (vla-get-filedependencies (vla-get-activedocument (vlax-get-acad-object))))
(setq n (vlax-get ss 'Count) i 1)
(while (<= i n)
(if (null (vl-catch-all-error-p (vl-catch-all-apply '(lambda(x) (vla-item x i)) (list ss))))
(progn
(setq xr (vla-item ss i) )
(and (= "Acad:XRef" (vla-get-feature xr))
(= xrefname (vla-get-filename xr))
(setq foundpath (vla-get-foundpath xr))
(setq i (1+ n)))))
  (setq i (1+ i)))
foundpath)
  • 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

Cám ơn bạn, code làm việc rất tốt!

Nhân tiện, bạn có thể hướng dẫn mình tìm tài liệu để học các hàm (vla- được không?

 

Bình thường trong VLisp, khi bôi đen lệnh và nhấn Ctrl+F1 thì mình sẽ nhận được trợ giúp về hàm đó. Nhưng với các hàm (vla- thì trợ giúp này mình không thể hiểu và áp dụng được!

99835_vlahelp.png

  • 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ưa có phản hồi nào, lẽ nào học các hàm (vla- lại khó đến vậy sao? Mình đã ngồi Google 2 ngày mà không tìm được điều gì đáng kể, haizzz!

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 có tài lieu nào cụ thể bang help developer đâu bạn ạ. Quy tắc viết tên hàm từ các method VBA ghi trong help thì chắc bạn biết rồi. Còn đối số của chúng thì ngoài kinh nghiệm (cần được tích luỹ dần) thì nhanh nhất là tra google. Ngoài ra thì việc phân tích cấu trúc dữ lieu của mỗi loại vla-object cũng sẽ giúp bạn nhanh chóng nắm được phương pháp sử dụng.

Mình đã tham khảo 1 số tài liệu về visual lisp và nhận thấy rang, viết để người đọc hiểu cách sử dung thì không khó, nhưng viết từ đâu, viết như thế nào để người đọc tiếp cận từ từ đến hết mới khó. tất cả tài liệu mình đọc đều có cảm giác người ta dạy mình từ ngọn vậy, và họ viết cũng hời hợ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

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
Đăng nhập để thực hiện theo  

×