Đến nội dung


Hình ảnh

Làm sao dể tự động kết nối 1 bản vẽ text sang 2(nhiều) bản vẽ khác


  • Please log in to reply
58 replies to this topic

#41 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 04 September 2010 - 09:01 PM

Dấu cách là được rồi.
Cho ra cả 2 dạng.
Thư mục do người dùng chỉ định

Anh test thử xem nhé!
Lệnh BKT: Bỏ tất cả các khoảng trắng trong dòng.
Lệnh BBKT: Bỏ khoảng trắng tới khi gặp ký tự.

(DEFUN c:bkt ( )
(setq filebandau (getfiled "Chon file .txt:" "" "txt" 0))

(setq filetaosau (getfiled "Chi dinh file ket qua:" "" "txt" 1))
(setq FILEMODEVIET (open filetaosau "a"))


(setq modedocfilebandau (open filebandau "r"))

(while (setq noidungdocduoccuafile (read-line modedocfilebandau))

(doanghepmoi))

(close modedocfilebandau)
(close FILEMODEVIET)


(princ)
)

;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
(DEFUN c:bbkt ( )
(setq filebandau (getfiled "Chon file .txt:" "" "txt" 0))

(setq filetaosau (getfiled "Chi dinh file ket qua:" "" "txt" 1))
(setq FILEMODEVIET (open filetaosau "a"))


(setq modedocfilebandau (open filebandau "r"))

(while (setq noidungdocduoccuafile (read-line modedocfilebandau))

(doanghep))

(close modedocfilebandau)
(close FILEMODEVIET)


(princ)
)

;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;

(DEFUN doanghepmoi ( )

(setq ddndtxt (strlen noidungdocduoccuafile))
(setq ddtrndtxt 0)
(setq txt "")

(repeat ddndtxt
(setq ddtrndtxt (+ ddtrndtxt 1))
(setq txtd (substr noidungdocduoccuafile ddtrndtxt 1))
(cond
((= " " txtd) (setq txtd ""))
);cond
(setq txt (strcat txt txtd))
);repeat

(write-line txt FILEMODEVIET)

(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;

(DEFUN doanghep ( )

(setq vitricochu 1)
(docco)
(write-line noidungdoc FILEMODEVIET)

(princ)
)

;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;


(DEFUN docco ( )

(setq vitricochu (+ vitricochu 1))
(setq noidungdoc (substr noidungdocduoccuafile vitricochu 1))
(if (= noidungdoc " ")
(docco)
)
(IF (/= noidungdoc " ") (PROGN
(setq noidungdoc (substr noidungdocduoccuafile vitricochu (- (strlen noidungdocduoccuafile) vitricochu)))
)
)

(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


#42 NDBNGO

NDBNGO

    biết lệnh rotate

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

Đã gửi 04 September 2010 - 09:57 PM

Em hiểu nhầm ý anh rồi.Để làm như trường hợp 1 thì dùng lệnh tim kiếm và thay thế được ngay
Phần 2 thi cắt không đúng :
Ý anh như thế này mà
một dòng có ghi là c1+32.5 Cống tả THi mình tách ra làm 2 chuỗi là c1+32.5 và Cống tả .
Từ dòng có c1+32.5m Cống tả ta cắt chuỗi để trở thành file mới có chữ cống tả thôi.
Không phải là bỏ khoảng trắng mà cắt ký tự từ khoảng trắng đầu tiên
Rất mất thời gian của em .em thông cảm nhé
  • 0

#43 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 05 September 2010 - 01:29 AM

Em hiểu nhầm ý anh rồi.Để làm như trường hợp 1 thì dùng lệnh tim kiếm và thay thế được ngay
Phần 2 thi cắt không đúng :
Ý anh như thế này mà
một dòng có ghi là c1+32.5 Cống tả THi mình tách ra làm 2 chuỗi là c1+32.5 và Cống tả .
Từ dòng có c1+32.5m Cống tả ta cắt chuỗi để trở thành file mới có chữ cống tả thôi.
Không phải là bỏ khoảng trắng mà cắt ký tự từ khoảng trắng đầu tiên
Rất mất thời gian của em .em thông cảm nhé

Chào bạn nbdngo,
Việc cắt chuỗi này thực ra rất đơn giản. Chỉ là dùng các hàm xử lý chuỗi mà thôi. Bạn có thể sử dụng đoạn lisp sau:

(defun c:ctxt ( )
(setq txt (cdr (assoc 1 (entget (car (entsel "\n Chon doi tuong text can tach chuoi" )))))
n (strlen txt)
i 1)
(while (<= i n)
(if (= (substr txt i 1) " ")
(setq ch1 (substr txt 1 (1- i))
ch2 (substr txt (1+ i))
i (+ i n)
)
)
(setq i (1+ i))
)
)

Sau khi chạy lisp bạn sẽ có chuỗi đầu là ch1 và chuỗi sau là ch2.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#44 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 06 September 2010 - 08:30 AM

Chạy tử của bạn Giabach thì thấy máy báo thế này nên chưa có nhận xét được:

http://www.4shared.c...Kqc/gibach.html
Nhờ các bạn xem giúp.
Cảm ơn

Sorry, do file Cad tui lưu ở định dạng Cad 2008 mà bác dùng Cad2004 (trong video minh họa) nên không mở file đuợc.

Upload file đã lưu ở định dạng Cad 2004.
Bác thử lại nhé : File Cad + Lisp
  • 0

#45 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 06 September 2010 - 02:14 PM

Em hiểu nhầm ý anh rồi.Để làm như trường hợp 1 thì dùng lệnh tim kiếm và thay thế được ngay
Phần 2 thi cắt không đúng :
Ý anh như thế này mà
một dòng có ghi là c1+32.5 Cống tả THi mình tách ra làm 2 chuỗi là c1+32.5 và Cống tả .
Từ dòng có c1+32.5m Cống tả ta cắt chuỗi để trở thành file mới có chữ cống tả thôi.
Không phải là bỏ khoảng trắng mà cắt ký tự từ khoảng trắng đầu tiên
Rất mất thời gian của em .em thông cảm nhé

Hề hề hề,
Với sự giúp sức của bác Master_Worse, mình có cái nè hay hơn gửi bạn coi thử:

(defun c:ctxt ()
(vl-load-com)
(setq txt (cdr(assoc 1 (entget (car (entsel "\n Chon text can tach chuoi"))))))
(setq ltxt (ctext txt)
(setq ch1 (car ltxt)
(setq ch2 (cadr ltxt)
)
(defun ctext (string / str1 str2)
(or vl-string-search (vl-load-com))
(setq pos (vl-string-search " " string)
str1 (substr string 1 pos)
str2 (substr string (+ pos 2))
) ;_ end setq
(list str1 str2)
) ;_ end defun

Chúc bạn vui.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#46 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 07 September 2010 - 02:10 AM

Đây là demo cho phép cập nhật 2 Text đã đánh dấu trên file MC2.dwgban2n.dwg
chú ý : Lisp chỉ cập nhật TEXT trên 2 file MC2.dwgban2n.dwg
tên lệnh : UpTxt
Link Download : File Cad + Lisp

Chạy CT của gia_bach, thấy bạn sd một kỹ thuật rất lạ.
1- Nếu cái file chọn để cập nhật (vd là mc2.dwg) chưa mở, CT vẫn cập nhật vào file nội dung mới nhưng kg hề mở file mc2.dwg
2- Nếu cái file chọn cập nhật đã mở, CT vẫn cập nhật và save nội dung mới vào file nhưng sự thay đổi đó kg thể hiện ngay lên cái file đang mở (mặc dù nó chính là nó).
Khó hiểu. Nếu gia_bach kg nói ra, các bạn có ai hiểu đc nó là gì kg
  • 0

#47 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 07 September 2010 - 08:59 AM

Chạy CT của gia_bach, thấy bạn sd một kỹ thuật rất lạ.
1- Nếu cái file chọn để cập nhật (vd là mc2.dwg) chưa mở, CT vẫn cập nhật vào file nội dung mới nhưng kg hề mở file mc2.dwg
2- Nếu cái file chọn cập nhật đã mở, CT vẫn cập nhật và save nội dung mới vào file nhưng sự thay đổi đó kg thể hiện ngay lên cái file đang mở (mặc dù nó chính là nó).
Khó hiểu. Nếu gia_bach kg nói ra, các bạn có ai hiểu đc nó là gì kg

chào TRUNGNGAMY
1. kg hề mở file mc2.dwg
- Nguyên tắc chung là : muốn vào nhà phải mở cửa (cổng), muốn mở cửa phải có chìa khóa thích hợp.
Với các tập tin trên máy tính thì nguyên tắc này càng quan trọng và đuợc thực hiện theo 1 qui trình rõ ràng. (Máy tính không cho phép nhảy qua tuơng rào đâu)
Vd đơn giản như với file TEXT, khi viết LISP bạn phải dùng lệnh (Open tên_file mode ) truớc khi đọc-ghi trên file đó. Bạn cũng không thấy nó mở ra lúc nào và đóng vào lúc nào. Nhưng thực sự file đã đuợc mở-đóng để đọc-ghi dữ liệu.
Trong VD trên tôi mở file với thuộc tính là BackRound hay InVisible.

2. sự thay đổi đó kg thể hiện ngay lên cái file đang mở
- thực sự là data đã đuợc cập nhật. Nhưng chỉ CAD chưa hiển thị trên giao diện đồ họa thôi, bạn phải gọi lệnh REGEN để Cad hiển thị lại data trong file lên giao diện đồ họa. (Điều này cũng hay gặp trong các thao tác với Block thuộc tính hay FIELD)

PS : Tôi có đọc đuợc thắc mắc tuơng tự của bạn bên mục AutoLisp, khi có thời gian Tôi sẽ trả lời bạn.
  • 1

#48 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 07 September 2010 - 09:33 AM

chào TRUNGNGAMY
1. kg hề mở file mc2.dwg
- Nguyên tắc chung là : muốn vào nhà phải mở cửa (cổng), muốn mở cửa phải có chìa khóa thích hợp.
Với các tập tin trên máy tính thì nguyên tắc này càng quan trọng và đuợc thực hiện theo 1 qui trình rõ ràng. (Máy tính không cho phép nhảy qua tuơng rào đâu)
Vd đơn giản như với file TEXT, khi viết LISP bạn phải dùng lệnh (Open tên_file mode ) truớc khi đọc-ghi trên file đó. Bạn cũng không thấy nó mở ra lúc nào và đóng vào lúc nào. Nhưng thực sự file đã đuợc mở-đóng để đọc-ghi dữ liệu.
Trong VD trên tôi mở file với thuộc tính là BackRound hay InVisible.

2. sự thay đổi đó kg thể hiện ngay lên cái file đang mở
- thực sự là data đã đuợc cập nhật. Nhưng chỉ CAD chưa hiển thị trên giao diện đồ họa thôi, bạn phải gọi lệnh REGEN để Cad hiển thị lại data trong file lên giao diện đồ họa. (Điều này cũng hay gặp trong các thao tác với Block thuộc tính hay FIELD)

PS : Tôi có đọc đuợc thắc mắc tuơng tự của bạn bên mục AutoLisp, khi có thời gian Tôi sẽ trả lời bạn.

Cám ơn bạn. Tuy kg chuyên nghiệp nhưng mình đã từng lập trình trên Delphi, VC++ kể cảch sd các kỹ thuật như ADO, Automation nên sau đó mình lơ mơ hiểu những gi bạn làm. Nhưng kg biết cụ thể làm như thế nào. Dạo này mình bận rộn và lớn tuổi nên kg đi sâu vào nữa. Về lisp thì mình cũng kg nghiên cứu đc VisualLisp, mình rất tiếc. Trước đây thấy lisp hơi yếu nên mình chủ yếu làm trên ARX, nhưng nó lại phụ thuộc phiên bản cũng thấy bất tiện nên mình cũng hạn chế làm trên ARX.
Tuy bây giờ hơi chậm chạp nhưng nếu thực sự công việc buộc phải làm thì mình vẫn có thể làm đc.
  • 1

#49 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 07 September 2010 - 11:47 AM

chào TRUNGNGAMY
1. kg hề mở file mc2.dwg
- Nguyên tắc chung là : muốn vào nhà phải mở cửa (cổng), muốn mở cửa phải có chìa khóa thích hợp.
Với các tập tin trên máy tính thì nguyên tắc này càng quan trọng và đuợc thực hiện theo 1 qui trình rõ ràng. (Máy tính không cho phép nhảy qua tuơng rào đâu)
Vd đơn giản như với file TEXT, khi viết LISP bạn phải dùng lệnh (Open tên_file mode ) truớc khi đọc-ghi trên file đó. Bạn cũng không thấy nó mở ra lúc nào và đóng vào lúc nào. Nhưng thực sự file đã đuợc mở-đóng để đọc-ghi dữ liệu.
Trong VD trên tôi mở file với thuộc tính là BackRound hay InVisible.

2. sự thay đổi đó kg thể hiện ngay lên cái file đang mở
- thực sự là data đã đuợc cập nhật. Nhưng chỉ CAD chưa hiển thị trên giao diện đồ họa thôi, bạn phải gọi lệnh REGEN để Cad hiển thị lại data trong file lên giao diện đồ họa. (Điều này cũng hay gặp trong các thao tác với Block thuộc tính hay FIELD)

PS : Tôi có đọc đuợc thắc mắc tuơng tự của bạn bên mục AutoLisp, khi có thời gian Tôi sẽ trả lời bạn.

Chào bác Giabach,
Bác có thể hướng dẫn thêm về vấn đề: "Trong VD trên tôi mở file với thuộc tính là BackRound hay InVisible." này hay không????
Quả thực đây là một vấn đề mà mình cũng loay hoay chưa tìm ra lời giải. Mở một file text thì qua diễn đàn và các bác chỉ dẫn mình đã hiểu được và có thể sử dụng, Nhưng mở các file bản vẽ .DWG hay thậm chí .sldpart ra để xử lý trong lisp thì mình chưa biết cách. Rất mong bác chỉ giáo thêm.
Cám ơn bác trước.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#50 elleHCSC

elleHCSC

    biết lệnh copy

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

Đã gửi 07 September 2010 - 02:38 PM

Chào bác Giabach,
Bác có thể hướng dẫn thêm về vấn đề: "Trong VD trên tôi mở file với thuộc tính là BackRound hay InVisible." này hay không????
Quả thực đây là một vấn đề mà mình cũng loay hoay chưa tìm ra lời giải. Mở một file text thì qua diễn đàn và các bác chỉ dẫn mình đã hiểu được và có thể sử dụng, Nhưng mở các file bản vẽ .DWG hay thậm chí .sldpart ra để xử lý trong lisp thì mình chưa biết cách. Rất mong bác chỉ giáo thêm.
Cám ơn bác trước.


Thấy các bác tham gia sôi nổi quá nên mình cũng đoán mò thôi nhá :

Anh Gia Bach là đại gia Visual Lisp trên diễn đàn này mà nên chắc chắn đã dùng đến VL thì hiển nhiên có thể hỉểu nó là ActiveX. Mò mãi trong Help của CAD thấy có đoạn này và đoán mò GiaBach dùng tới các Method open và save để mở và lưu bản vẽ ở dạng Background, nhưng vẫn chưa hiểu anh Bach tìm và thay thế mấy cái text kia bằng kiểu gì ?!

http://www.cadviet.c...iles/3/anh1.rar

@ Trungngamy: Trước tôi cũng có dùng ActiveX của thằng www.opendwg.org (giờ đổi thành http://www.opendesign.com) và thông qua các hàm API của nó viết ứng dụng bằng Delphi để đọc, mở, chèn các obj vào dwg, save lại mà không cần phải mở dwg đó ra. Bạn qua đó down về và trải nghiệm (vì chắc bạn viết thành thục delphi) thì cũng sẽ đoan đoán được cách làm của Gia Bach (tức là dùng VLisp - là 1 dạng ActiveX để làm thôi).
  • 2
Share for all, all will share !

--------------------
HTTP://WWW.HCSC.VN
HTTP://WWW.HCSC.COM.VN

#51 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 07 September 2010 - 05:17 PM

Chào bác Giabach,
Bác có thể hướng dẫn thêm về vấn đề: "Trong VD trên tôi mở file với thuộc tính là BackRound hay InVisible." này hay không????
Quả thực đây là một vấn đề mà mình cũng loay hoay chưa tìm ra lời giải. Mở một file text thì qua diễn đàn và các bác chỉ dẫn mình đã hiểu được và có thể sử dụng, Nhưng mở các file bản vẽ .DWG hay thậm chí .sldpart ra để xử lý trong lisp thì mình chưa biết cách. Rất mong bác chỉ giáo thêm.
Cám ơn bác trước.

Bác thử tham khảo lisp tạo list các bản vẽ này xem
(defun c:lstdwg(/ dirbox Ouvrir_dessin_dbx rep lst fic dbx lay)

(defun dirbox(/ cdl rep)
(if (setq cdl (vlax-create-object "Shell.Application"))
(progn
(and (setq rep (vlax-invoke cdl 'browseforfolder 0 "Choose a directory" 512 ""))
(setq rep (vlax-get-property (vlax-get-property rep 'self) 'path))
)
(vlax-release-object cdl)
)
)
rep
)

(defun Ouvrir_dessin_dbx(dwg / dbx doc lan)
(vl-load-com)
(setq dwg (findfile dwg))
(vlax-for doc (vla-get-documents (vlax-get-acad-object))
(and (eq (strcase (vla-get-fullname doc)) (strcase dwg))
(setq dbx doc lan T)
)
)
(or dbx
(progn
(if (< (atoi (substr (getvar "ACADVER") 1 2)) 16)
(setq dbx (vlax-create-object "ObjectDBX.AxDbDocument"))
(setq dbx (vlax-create-object (strcat "ObjectDBX.AxDbDocument." (substr (getvar "ACADVER") 1 2))))
)
(vla-open dbx dwg)
)
)
(list dbx lan)
)

(vl-load-com)
(if (setq rep (dirbox))
(if (setq lst (vl-directory-files rep "*.dwg" 1))
(foreach fic lst
(if (setq dbx (ouvrir_dessin_dbx (strcat rep "/" fic)))
(progn
(princ (strcat "\n Working in " fic))(princ)
(vlax-for lay (vla-get-layouts (car dbx))
(princ (strcat "\n\t\tLayout : " (vla-get-name lay)))(princ)
)
(or (cadr dbx)(vlax-release-object (car dbx)))
)
(princ (strcat "\n Can't read file " fic))
)
)
(alert "No dwg's File")
)
)
(princ)
)


và đặc biệt là đoạn này
(if (< (atoi (substr (getvar "ACADVER") 1 2)) 16)
(setq dbx (vlax-create-object "ObjectDBX.AxDbDocument"))
(setq dbx (vlax-create-object (strcat "ObjectDBX.AxDbDocument." (substr (getvar "ACADVER") 1 2))))
)
(vla-open dbx dwg)
(vla-saveas dbx dwg)

  • 3

#52 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 08 September 2010 - 08:56 PM

Bác thử tham khảo lisp tạo list các bản vẽ này xem


Chào bác Nacata,
Mình đã thử áp dụng cái đoạn code bạn cho vào việc mở bản vẽ ra để xử lý. Xong có một số trở ngại mong bác hướng dẫn thêm.
1/- Mình đã mở được file ra và cũng đã thử được một vài lệnh lisp trong đó. Nhưng khổ nỗi muốn kiểm duyệt các lệnh này nó có hoạt động hay không thì chịu chết.
2/- Việc lưu lại cái file đã mở và đã thực hiện các lệnh lisp trên đó mình không làm được mặc dù đã dùng lệnh (vla-saveas dbx dwg) như bác đã chỉ. Mình cũng đã thử thay đổi các giá trị của biến hệ thống lispinit và sdi như gợi ý của bác Trungngamy nhưng vẫn không xi nhê gì.
Do mình không biết tham khảo về các lệnh vla- .... này ở đâu nên cũng bí luôn chả biết nó sai vì sao nữa.
3/- Khi sử dụng lệnh (vla-saveas dbx dwg) mình cũng sử dụng các biến dbx và dwg giống như khi mình đã dùng lệnh (vla-open dbx dwg) thì Cad hiện lên một bảng alert là Error writing/closing file.

Vậy bác và các bác khác có thể giải thích giùm mình các vấn đề trên được không??? Nếu có thể các bác chỉ cho mình các tài liệu có thể tham khảo về các hàm vla-... này với. Mình tìm hoài trong help mà chả thấy đâu. Khổ thế.

Rất mong được sự giúp đỡ từ các bác....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#53 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 08 September 2010 - 09:02 PM

Hề hề hề,
Cái bác chủ thớt này chắc mấy bữa nay bệnh rồi hay sao ý nhẩy. Quăng cái vấn đề ra cho mọi người cãi nhau ỏm tỏi mà chả thấy bác này í ới chi. Mấy câu hỏi mình chờ bác ấy giả nhời để còn có hướng mà vọc cũng chả thấy bác ấy ứ hự gì. Hay thật đấy.
Mong cho bác ấy chóng khỏi bệnh để còn làm chủ thớt cho nó vuông vắn.
Hề hề hề,.....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#54 NDBNGO

NDBNGO

    biết lệnh rotate

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

Đã gửi 08 September 2010 - 09:24 PM

Xin cảm ơn,các ban còn nhớ đến mình.Đợt này đang chỉ đạo công trình ở Yên tử ,sóng yếu quá 3G không online được.Chứ nhớ các ban và diễn đàn hơn nhớ người yêu đó.
Thỉnh thoảng cũng phải đi làm kiếm lấy 30-40 tr /tháng để láy lương khô ngồi học chú.
Đêm ngày ôm lísp hơn cả ôm vợ đấy .Sao vài 3 tháng nữa kiến thức bằng 1/10 Phamthanhbinh là ngôi chơi cũng đủ tiền nuối cả nhà rồi
Cảm ơn các ban lần nữa.
  • 1

#55 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 08 September 2010 - 09:38 PM

Chào bác Nacata,
Mình đã thử áp dụng cái đoạn code bạn cho vào việc mở bản vẽ ra để xử lý. Xong có một số trở ngại mong bác hướng dẫn thêm.
1/- Mình đã mở được file ra và cũng đã thử được một vài lệnh lisp trong đó. Nhưng khổ nỗi muốn kiểm duyệt các lệnh này nó có hoạt động hay không thì chịu chết.
2/- Việc lưu lại cái file đã mở và đã thực hiện các lệnh lisp trên đó mình không làm được mặc dù đã dùng lệnh (vla-saveas dbx dwg) như bác đã chỉ. Mình cũng đã thử thay đổi các giá trị của biến hệ thống lispinit và sdi như gợi ý của bác Trungngamy nhưng vẫn không xi nhê gì.
Do mình không biết tham khảo về các lệnh vla- .... này ở đâu nên cũng bí luôn chả biết nó sai vì sao nữa.
3/- Khi sử dụng lệnh (vla-saveas dbx dwg) mình cũng sử dụng các biến dbx và dwg giống như khi mình đã dùng lệnh (vla-open dbx dwg) thì Cad hiện lên một bảng alert là Error writing/closing file.

Vậy bác và các bác khác có thể giải thích giùm mình các vấn đề trên được không??? Nếu có thể các bác chỉ cho mình các tài liệu có thể tham khảo về các hàm vla-... này với. Mình tìm hoài trong help mà chả thấy đâu. Khổ thế.

Rất mong được sự giúp đỡ từ các bác....

- Bác chú ý là trong đoạn
(vla-saveas dbx dwg) ... (vla-saveas dbx dwg)
thì dấu ... bác phải dùng các hàm visual lisp (vla-, vl- , vlax ...) để tác động tới đối tượng của bản vẽ
- Không cần phải tác động tới 2 biến lispinit và sdi lisp vẫn chạy như thường
- Bác chú ý sau khi hoàn tất các bước bác phải Release các biến vla- đi nhé
- Bác thử đưa đoạn Code bác viết lên mọi người xem thử mới biết lỗi xảy ra ở đâu
- Dùng DBX được cái nhanh hơn Scrip nhưng attsync thì em chịu không biết nhúng vào thế nào, nhờ các bác chỉ giáo
  • 0

#56 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 08 September 2010 - 10:04 PM

- Bác chú ý là trong đoạn
(vla-saveas dbx dwg) ... (vla-saveas dbx dwg)
thì dấu ... bác phải dùng các hàm visual lisp (vla-, vl- , vlax ...) để tác động tới đối tượng của bản vẽ
- Không cần phải tác động tới 2 biến lispinit và sdi lisp vẫn chạy như thường
- Bác chú ý sau khi hoàn tất các bước bác phải Release các biến vla- đi nhé
- Bác thử đưa đoạn Code bác viết lên mọi người xem thử mới biết lỗi xảy ra ở đâu
- Dùng DBX được cái nhanh hơn Scrip nhưng attsync thì em chịu không biết nhúng vào thế nào, nhờ các bác chỉ giáo

Chào bác Nacata,
Cái đoạn code ấy nó đây, cũng là cái để mình thử xài cho cái yêu cầu của bác ndbngo ấy mà.

(defun c:cmtxt ( )
(vl-load-com)
(command "undo" "be")
(setq lp (getvar "lispinit"))
(setq sd (getvar "sdi"))
;;;;;;(setvar "lispinit" 0)
;;;;;;(setvar "sdi" 1)
(setq sst (ssget (list (cons 0 "MTEXT")))
n (sslength sst)
i 0
lscotxt (list)
)
(while (< i n)
(setq ent (ssname sst i)
elst (entget ent)
ht (cdr (assoc 40 elst))
mt (cdr (assoc 1 elst))
st (cdr (assoc 7 elst))
gt (cdr (assoc 50 elst))

)
(alert (strcat " Noi dung text la" mt))
(setq ans (getstring "\n Ban muon thay doi noi dung text (y or n): "))
(if (= ans "y")
(setq mt (getstring T "\n Nhap noi dung text moi: "))
)
(setq cod (strcase (getstring T "\n Nhap ma diem nhap text: "))
lscotxt (append lscotxt (list (list cod st ht gt mt)))
i (1+ i)
)
)
(while (setq dwg (getfiled "Chon file ban ve can bo sung" "" "dwg" 0))
(if (setq dbx (ouvrir_dessin_dbx dwg ))
(progn
(get_datapoint)
(foreach cotxt lscotxt
(setq co1 (car cotxt)
st1 (cadr cotxt)
ht1 (caddr cotxt)
gt1 (cadddr cotxt)
mt1 (car (cddddr cotxt))
)
(foreach po pdlst
(if (= (car po) co1)
(progn
(entmake (list (cons 0 "MTEXT") (cons 1 mt1) (cons 7 st1)
(cons 40 ht1) (cons 50 gt1) (cons 10 (cdr po))))
(entupd (entlast))
(command "regenall")
)
)
)

)

)
)
(vla-saveas dbx dwg)


)

(setvar "lispinit" lp)
(setvar "sdi" sd)
(command "undo" "e")
(princ)
)


(defun Ouvrir_dessin_dbx(dwg / dbx doc lan)
(vl-load-com)
(setq dwg (findfile dwg))
(vlax-for doc (vla-get-documents (vlax-get-acad-object))
(and (eq (strcase (vla-get-fullname doc)) (strcase dwg))
(setq dbx doc lan T)
) ;;;;;;;;;;;;;;;; Close and
) ;;;;;;;;;;;;;;;; Close vlax-for
(or dbx
(progn
(if (< (atoi (substr (getvar "ACADVER") 1 2)) 16)
(setq dbx (vlax-create-object "ObjectDBX.AxDbDocument"))
(setq dbx (vlax-create-object (strcat "ObjectDBX.AxDbDocument." (substr (getvar "ACADVER") 1 2))))
) ;;;;;;;;;;; Close if
(vla-open dbx dwg)
) ;;;;;;;;;;;;; Close progn
) ;;;;;;;;;;;;;; Close or
(list dbx lan)
dbx
) ;;;;;;;;;;;;;;;; Close ouvrir_dessin_dbx

(defun get_datapoint ( )
(setq data (list))
(while (setq filecsv (getfiled "Chon file toa do diem chen: " "" "sl" 0))
(setq f (open filecsv "r")

)
(setq str (read-line f))
(while str
(setq cdata (list str)
data (append data (list cdata))
str (read-line f)
)
)
(close f)
)
data

(setq ptlst (list))
(foreach pt data
(setq str (car pt)
len (strlen str)
i 1
)
(setq stlst (list))
(while (<= i len)
(if (= (substr str i 1) " ")
(progn
(setq st1 (substr str 1 (1- i))
str (substr str (1+ i))
len (strlen str)
i 0
)
(if (not (equal st1 ""))
(setq stlst (append stlst (list st1)))
)
)
)
(setq i (1+ i))
)
(if (= len 1)
(progn
(setq st1 str
stlst (append stlst (list st1))
)
)
)
(setq ptlst (append ptlst (list stlst)))
)
(setq pdlst (list))
(foreach pd ptlst
(setq old (getvar "luprec"))
(setvar "luprec" 3)
(setq ma (car pd)
x (atof (caddr pd) )
y (atof (cadr pd) )
z (atof (cadddr pd) )
pos (list ma x y z)
pdlst (append pdlst (list pos))
)
)
(setvar "luprec" old)
pdlst
)


Nói như bác thì mình làm sai tuốt luốt rồi vì trong cái khúc ... ấy mình toàn dùng hàm lisp bình thường thôi bác ạ....
Cái vụ xóa biến mình cũng chưa rõ lắm nữa.
Hề hề hề, dốt quá.....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#57 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 09 September 2010 - 12:42 AM

Chào bác Nacata,
Cái đoạn code ấy nó đây, cũng là cái để mình thử xài cho cái yêu cầu của bác ndbngo ấy mà.


(defun c:cmtxt ( )
(vl-load-com)
(command "undo" "be")
(setq lp (getvar "lispinit"))
(setq sd (getvar "sdi"))
;;;;;;(setvar "lispinit" 0)
;;;;;;(setvar "sdi" 1)
(setq sst (ssget (list (cons 0 "MTEXT")))
n (sslength sst)
i 0
lscotxt (list)
)
(while (< i n)
(setq ent (ssname sst i)
elst (entget ent)
ht (cdr (assoc 40 elst))
mt (cdr (assoc 1 elst))
st (cdr (assoc 7 elst))
gt (cdr (assoc 50 elst))

)
(alert (strcat " Noi dung text la" mt))
(setq ans (getstring "\n Ban muon thay doi noi dung text (y or n): "))
(if (= ans "y")
(setq mt (getstring T "\n Nhap noi dung text moi: "))
)
(setq cod (strcase (getstring T "\n Nhap ma diem nhap text: "))
lscotxt (append lscotxt (list (list cod st ht gt mt)))
i (1+ i)
)
)
(while (setq dwg (getfiled "Chon file ban ve can bo sung" "" "dwg" 0))
(if (setq dbx (ouvrir_dessin_dbx dwg ))
(progn
(get_datapoint)
(foreach cotxt lscotxt
(setq co1 (car cotxt)
st1 (cadr cotxt)
ht1 (caddr cotxt)
gt1 (cadddr cotxt)
mt1 (car (cddddr cotxt))
)
(foreach po pdlst
(if (= (car po) co1)
(progn
(entmake (list (cons 0 "MTEXT") (cons 1 mt1) (cons 7 st1)
(cons 40 ht1) (cons 50 gt1) (cons 10 (cdr po))))
(entupd (entlast))
(command "regenall")
)
)
)

)

)
)
(vla-saveas dbx dwg)
)

(setvar "lispinit" lp)
(setvar "sdi" sd)
(command "undo" "e")
(princ)
)
(defun Ouvrir_dessin_dbx(dwg / dbx doc lan)
(vl-load-com)
(setq dwg (findfile dwg))
(vlax-for doc (vla-get-documents (vlax-get-acad-object))
(and (eq (strcase (vla-get-fullname doc)) (strcase dwg))
(setq dbx doc lan T)
) ;;;;;;;;;;;;;;;; Close and
) ;;;;;;;;;;;;;;;; Close vlax-for
(or dbx
(progn
(if (< (atoi (substr (getvar "ACADVER") 1 2)) 16)
(setq dbx (vlax-create-object "ObjectDBX.AxDbDocument"))
(setq dbx (vlax-create-object (strcat "ObjectDBX.AxDbDocument." (substr (getvar "ACADVER") 1 2))))
) ;;;;;;;;;;; Close if
(vla-open dbx dwg)
) ;;;;;;;;;;;;; Close progn
) ;;;;;;;;;;;;;; Close or
(list dbx lan)
dbx
) ;;;;;;;;;;;;;;;; Close ouvrir_dessin_dbx

(defun get_datapoint ( )
(setq data (list))
(while (setq filecsv (getfiled "Chon file toa do diem chen: " "" "sl" 0))
(setq f (open filecsv "r")

)
(setq str (read-line f))
(while str
(setq cdata (list str)
data (append data (list cdata))
str (read-line f)
)
)
(close f)
)
data

(setq ptlst (list))
(foreach pt data
(setq str (car pt)
len (strlen str)
i 1
)
(setq stlst (list))
(while (<= i len)
(if (= (substr str i 1) " ")
(progn
(setq st1 (substr str 1 (1- i))
str (substr str (1+ i))
len (strlen str)
i 0
)
(if (not (equal st1 ""))
(setq stlst (append stlst (list st1)))
)
)
)
(setq i (1+ i))
)
(if (= len 1)
(progn
(setq st1 str
stlst (append stlst (list st1))
)
)
)
(setq ptlst (append ptlst (list stlst)))
)
(setq pdlst (list))
(foreach pd ptlst
(setq old (getvar "luprec"))
(setvar "luprec" 3)
(setq ma (car pd)
x (atof (caddr pd) )
y (atof (cadr pd) )
z (atof (cadddr pd) )
pos (list ma x y z)
pdlst (append pdlst (list pos))
)
)
(setvar "luprec" old)
pdlst
)


Nói như bác thì mình làm sai tuốt luốt rồi vì trong cái khúc ... ấy mình toàn dùng hàm lisp bình thường thôi bác ạ....
Cái vụ xóa biến mình cũng chưa rõ lắm nữa.
Hề hề hề, dốt quá.....

Công nhận bác phamthanhbinh rất nhiệt tình có mặt mọi lúc mọi nơi. Vụ mấy cái hàm mới bác nghiên cứu đi, lúc nào thông suốt chỉ cho mình với chú mình còn dốt VL lắm. Riêng vđ của bác ndbngo thì chỉ cần cad14 và cái biến lispinit là làm đc rồi. biến sdi chủ yéu làm cho cad2000 trở lên kg mở đc nhiều bv cùng lúc cho nó giống như cad14 thôi. Mình nghĩ vận dụng việc mở đóng file kg hiển thị lên cửa sổ cad là kỹ thuật hay nhưng nếu kg cần thiết thì cũng kg nên dùng vì nó có nhiều rủi ro hơn, vì lúc đó sự hoạt động của các hàm này có thể do hệ điều hành điều khiển chứ kg phải do riêng cad điều khiển. Trước đây khi lập trình trên Delphi mình đã sd kỹ thuật OLE-Automation để gởi dữ liệu từ phần mềm bình sai vào cad nên mình cũng có hiểu sơ sơ về nó. Tuy nhiên, lâu quá rồi mình cũng quên, sự giống và khác nhau giữa các kỹ thuật này chắc nhờ các cao thủ trên diễn đàn phân tích thêm. Mình bây giờ thuộc dạng "kg biết dựa cột mà nghe" chứ kg phải ngủ quên đâu
  • 0

#58 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 09 September 2010 - 11:24 AM

Công nhận bác phamthanhbinh rất nhiệt tình có mặt mọi lúc mọi nơi. Vụ mấy cái hàm mới bác nghiên cứu đi, lúc nào thông suốt chỉ cho mình với chú mình còn dốt VL lắm. Riêng vđ của bác ndbngo thì chỉ cần cad14 và cái biến lispinit là làm đc rồi. biến sdi chủ yéu làm cho cad2000 trở lên kg mở đc nhiều bv cùng lúc cho nó giống như cad14 thôi. Mình nghĩ vận dụng việc mở đóng file kg hiển thị lên cửa sổ cad là kỹ thuật hay nhưng nếu kg cần thiết thì cũng kg nên dùng vì nó có nhiều rủi ro hơn, vì lúc đó sự hoạt động của các hàm này có thể do hệ điều hành điều khiển chứ kg phải do riêng cad điều khiển. Trước đây khi lập trình trên Delphi mình đã sd kỹ thuật OLE-Automation để gởi dữ liệu từ phần mềm bình sai vào cad nên mình cũng có hiểu sơ sơ về nó. Tuy nhiên, lâu quá rồi mình cũng quên, sự giống và khác nhau giữa các kỹ thuật này chắc nhờ các cao thủ trên diễn đàn phân tích thêm. Mình bây giờ thuộc dạng "kg biết dựa cột mà nghe" chứ kg phải ngủ quên đâu

Chào bác Trungngamy,
Những lời góp ý của bác thật đúng. Chỉ tại mình không tìm được cách mở các file bản vẽ bằng lisp như bác đã nói nên mới lọ mọ tới cái vla mà bác Nacata chỉ cho chứ cũng có hiểu gì nhiều về nó đâu. Nếu mình mở được thì chắc chắn cũng sẽ làm y như bác hướng dẫn vậy.
Cũng vì chả mở được nên mình mới nghĩ ra cái cách hơi chuối là đưa tất cả các bản vẽ cần mở về cùng một file rồi làm việc với file này. Sau đó thì lại tách các file kết quả ra bằng các lệnh cad thông dụng bác ạ. Với phương án này thì mình đã làm được rồi, nhưng nó chuối quá nên mình không post lên và để đó để dành khi hữu sự thì xài tạm vậy.
Còn mình vẫn đang cố các cách khác sao cho nó có hiệu quả hơn và khả dĩ được coi là tự động như bác ndbngo đã yêu cầu.
Hề hề hề, cái sự dựa cột thì mình cũng dựa lâu lâu rồi, nghe cũng được lắm, mà mót cũng được không ít bác ạ. Tuy nhiên mình thấy đôi khi cũng nên cho người ta biết cái dốt của mình thì cái sự mót nó sẽ được khá hơn bác ạ.
Hề hề hề...
Chúc bác dồi dào sức khỏe để thức lâu lâu, giúp anh em Cadviet có thêm cảm hứng đi mót bác nhé.....
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#59 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 09 September 2010 - 01:25 PM

Chào bác Giabach,
Bác có thể hướng dẫn thêm về vấn đề: "Trong VD trên tôi mở file với thuộc tính là BackRound hay InVisible." này hay không????
Quả thực đây là một vấn đề mà mình cũng loay hoay chưa tìm ra lời giải. Mở một file text thì qua diễn đàn và các bác chỉ dẫn mình đã hiểu được và có thể sử dụng, Nhưng mở các file bản vẽ .DWG hay thậm chí .sldpart ra để xử lý trong lisp thì mình chưa biết cách. Rất mong bác chỉ giáo thêm.
Cám ơn bác trước.

Chào bác phamthanhbinh,
Vì khả năng diễn giải có hạn. Bác vui lòng tham khảo các ví dụ sau :
VD1 : Open file sử dụng hàm Vla-Open
với tùy chọn Set Active (đưa về hiện hành) cho file.
Sau khi open file, bác làm việc với đối tuợng VLA đuợc gán vào biến file-opened

(defun c:openFile (/ doc file-opened fileName openflag)
(vl-load-com)
(setq fileName (getfiled "FILE TO OPEN" "" "dwg" 16))
(if (equal (vla-get-FullName(vla-get-ActiveDocument (vlax-get-Acad-Object))) fileName)
(princ (strcat "\nFile ban chon : "
fileName
" da duoc mo roi. \nVa dang duoc Set Activate." ) )
(progn
(setq doc (vla-get-documents (vlax-get-acad-object)))
(setq openFlag nil)
(vlax-for dwg doc
(if (= (vla-get-FullName dwg) fileName)
(progn
(setq file-opened dwg openFlag T)
(princ (strcat "\nFile ban chon : "
(vla-get-FullName file-opened)
" da duoc mo roi. \nNhung chua duoc Set Activate." ) ) )) )
(if (not openFlag)
(progn
(setq file-opened (vla-open doc fileName))
(princ (strcat "\nLisp vua thuc hien mo file : "
(vla-get-FullName file-opened)
"\nNhung chua duoc Set Activate." ) )))
(initget "Y N y n")
(setq actFlag (getkword "\nBan co muon Set Activate cho file khong (Y/N):"))
(if (= actFlag "Y")
(vla-activate file-opened) )))
(princ ) )


VD2 : Tạo Layer có tên "CadViet" trên tất cả các file đang mở :
(thay đổi biến layName cho phù hợp)
(defun c:AddLayer (/ layexist layname)
(setq layName "CadViet"
layExist nil)
(vlax-for dwg (vla-get-Documents (vlax-get-acad-object))
(vlax-for lay (vla-get-layers dwg)
(if (= (vla-get-name lay) layName)
(setq layExist T)) )
(if (not layExist)
(vl-catch-all-apply 'vla-add (list (vla-get-layers dwg) layName))))
(princ))


VD3 : Thay thế các Text có giá trị "Text" với giá tri mới là "CadViet" trên tất cả các file đang mở :
(có thể thay thế tại dòng : (setq oldTxt "Text" newTxt "CadViet") cho phù hợp.)
(defun c:ReplaceTxt (/ newtxt oldtxt)
;(setq oldTxt (getstring "\nNhap gia tri Text can thay the :"))
(setq oldTxt "Text"
newTxt "CadViet")
(vlax-for dwg (vla-get-Documents (vlax-get-acad-object))
(vlax-for lay (vla-get-layouts dwg)
(vlax-for obj (vla-get-Block lay)
(if (and
(eq "AcDbText" (vla-get-ObjectName obj))
(eq oldTxt (vla-get-TextString obj)))
(vla-put-TextString obj newTxt))))
(vla-regen dwg acAllViewports))
(princ))

  • 2