Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
24 replies to this topic

#1 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 12 March 2013 - 03:17 PM

Đố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!


  • 0

#2 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 13 March 2013 - 01:08 PM

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


  • 0

#3 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 13 March 2013 - 01:49 PM

Bạn thử tìm hiểu cú pháp hàm này xem:

vla-get-FoundPath


  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#4 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 13 March 2013 - 03:49 PM

hic, không biết đối số của hàm này như thế nào, bác HA nói rõ hơn được không?


  • 0

#5 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 13 March 2013 - 04:23 PM

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.


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#6 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 13 March 2013 - 05:22 PM

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!


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#7 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 13 March 2013 - 06:00 PM

@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


  • 0

#8 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 13 March 2013 - 06:08 PM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#9 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 13 March 2013 - 06:22 PM

Ý là mình đang chê cách làm của ketxu không dùng được đấy, hì ^^


  • 0

#10 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 13 March 2013 - 09:06 PM

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 đó :)
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#11 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 14 March 2013 - 08:04 AM

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


  • 0

#12 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 14 March 2013 - 09:36 AM

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


  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#13 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 14 March 2013 - 10:05 AM

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.


  • 0

#14 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 14 March 2013 - 10:06 AM

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

  • 1

#15 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 14 March 2013 - 10:44 AM

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?


  • 0

#16 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 14 March 2013 - 11:03 AM

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)


  • 1

#17 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 14 March 2013 - 11:18 AM

Không thực thi được bạn ạ! Có lỗi:

; error: Automation Error. Key not found


  • 0

#18 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 14 March 2013 - 11:31 AM

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

  • 0

#19 LoveLisp

LoveLisp

    biết lệnh extend

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

Đã gửi 14 March 2013 - 11:45 AM

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


  • 0

#20 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

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

Đã gửi 14 March 2013 - 03:35 PM

 bạn thử breack code trên xem lỗi tại đâu. hoặc gửi bản vẽ lên để mình kiểm tra xem mình đã bỏ quên bước nào.


  • 0