Đến nội dung


Hình ảnh
* * * - - 8 Bình chọn

Viết lisp theo yêu cầu [phần 2]


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#1701 truongthanh

truongthanh

    biết lệnh text

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

Đã gửi 07 September 2010 - 03:24 PM

Cho mình hỏi có lisp nào như thế này ko?mình đã search rồi mà ko thấy!
ví dụ mình có bản vẽ có 100 bóng đèn, đã bị explode ra rồi, vậy giờ có cách nào quét chọn lại hết các bóng đèn đó thì nó trở lại thành block ko?(mỗi bóng đèn là một 1 block, tất cả các block cùng 1 tên,tên block do mình đặt!)
Thankss!

có ai giúp mình với!
  • 0

#1702 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 07 September 2010 - 03:37 PM

Cho mình hỏi có lisp nào như thế này ko?mình đã search rồi mà ko thấy!
ví dụ mình có bản vẽ có 100 bóng đèn, đã bị explode ra rồi, vậy giờ có cách nào quét chọn lại hết các bóng đèn đó thì nó trở lại thành block ko?(mỗi bóng đèn là một 1 block, tất cả các block cùng 1 tên,tên block do mình đặt!)
Thankss!

Căng quá nhỉ? Vụ này rất khó xử. Thường thì dựa vào 1 điểm chung nào đó thì mới khôi phục được. Truongthanh hãy upload file có bóng đèn đó bị explode và có cái block bóng đèn đó lên đây nhé.
  • 1

#1703 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 - 03:40 PM

có ai giúp mình với!

Bạn phải gửi file lên thì mới biết cái block của bạn có những gì chớ. Cái yêu cầu của bạn khá oái oăm, nếu là mới lỡ tay thì bạn thử dùng undo xem sao. Còn nếu đã chọc ngoáy nó chán chê thì ...... toi.
Hề 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.

#1704 truongthanh

truongthanh

    biết lệnh text

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

Đã gửi 07 September 2010 - 03:59 PM

Căng quá nhỉ? Vụ này rất khó xử. Thường thì dựa vào 1 điểm chung nào đó thì mới khôi phục được. Truongthanh hãy upload file có bóng đèn đó bị explode và có cái block bóng đèn đó lên đây nhé.

Hix cảm ơn bác Bình và bác TUE_NV, em nghe 2 bác nói vậy là em biết impossible!
thanks 2 bác đã quan tâm đền em!
  • 0

#1705 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

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

Hix cảm ơn bác Bình và bác TUE_NV, em nghe 2 bác nói vậy là em biết impossible!
thanks 2 bác đã quan tâm đền em!

Truongthanh cứ gửi file lên biết đâu được tìm ra giải pháp.
Hoặc giả dụ như không tìm ra giải pháp thì chí ít cũng tìm ra cách để bạn xử lý nó 1 cách nhanh hơn, công việc đỡ vất vả hơn. Tuy nhiên, nếu có giải quyết được thì cũng không......
Truongthanh gửi file lên đây nhé.
  • 1

#1706 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 07 September 2010 - 04:20 PM

@ nguyentuyen6: Bạn có thể xài cái này cho trường hợp của bạn. Nếu bạn không thể hãy post lên nhé.


Bac làm giúp mình cai multi nứa đc ko ? e loay hoay 1 lúc thì tắc tịt.

Nghĩa là chọn 1 vùng (Có thể có block hoặc không) >>>> lọc dim (nếu có block thì lấy lấy cả dim trong block luôn)
rồi áp dụng lệnh này với các dim vừa lọc xong ý. Cảm ơn bác.. hehe
  • 0

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#1707 truongthanh

truongthanh

    biết lệnh text

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

Đã gửi 07 September 2010 - 04:37 PM

Truongthanh cứ gửi file lên biết đâu được tìm ra giải pháp.
Hoặc giả dụ như không tìm ra giải pháp thì chí ít cũng tìm ra cách để bạn xử lý nó 1 cách nhanh hơn, công việc đỡ vất vả hơn. Tuy nhiên, nếu có giải quyết được thì cũng không......
Truongthanh gửi file lên đây nhé.

Nhờ TUE_NV xem dùm mình nhé!
http://www.cadviet.c...files/3/den.dwg
Thanks TUE_NV nhiều!
  • 0

#1708 nguyentieu

nguyentieu

    biết vẽ circle

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

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

@nguyên tiêu : Lisp như điều bạn muốn đã có trên diễn đàn rồi. Bạn chịu khó Tìm kiếm vậy.


Bác Tue_VN ơi, e đã thử với các từ khóa như: "lisp gióng dim", "lisp dim thẳng hàng", đều ko tìm được lisp mong muốn. Bác có thể bớt chút thời gian chỉ e chỗ nào có lisp đó ko ạ?

E cảm ơn bác.
  • 0

#1709 nguyentuyen6

nguyentuyen6

    biết lệnh chamfer

  • Advance Member
  • PipPipPipPip
  • 213 Bài viết
Điểm đánh giá: 124 (tàm tạm)

Đã gửi 07 September 2010 - 04:41 PM

cái này mình hay dùng


;**********************************************************************
*********
;* WRITTEN BY DAO NGUYEN THANG 94X3 - HANOI ARCHITECTURAL UNIVERSITY (VIETNAM) *
;*******************************************************************************

(defun myerror (s) ; If an error (such as CTRL-C) occurs
; while this command is active...
(cond
((= s "quit / exit abort") (princ))
((/= s "Function cancelled") (princ (strcat "\nError: " s)))
)
(setvar "cmdecho" CMD) ; Restore saved modes
(setvar "osmode" OSM)
(setq *error* OLDERR) ; Restore old *error* handler
(princ)
)
;*******************************************************************************

(DEFUN C:CD (/ CMD SS LTH DEM PT DS KDL N70 GOCX GOCY PT13 PT14 PTI PT13I PT14I
PT13N PT14N O13 O14 N13 N14 OSM OLDERR PT10 PT11)
(SETQ CMD (GETVAR "CMDECHO"))
(SETQ OSM (GETVAR "OSMODE"))
(SETQ OLDERR *error*
*error* myerror)
(PRINC "Chon doi tuong Dimension!")
(SETQ SS (SSGET))
(SETVAR "CMDECHO" 0)
(SETQ PT (GETPOINT "Diem cat Dimension:"))
(SETQ PT (TRANS PT 1 0))
(COMMAND "UCS" "W")
(SETQ LTH (SSLENGTH SS))
(SETQ DEM 0)
(WHILE (< DEM LTH)
(PROGN
(SETQ DS (ENTGET (SSNAME SS DEM)))
(SETQ KDL (CDR (ASSOC 0 DS)))
(IF (= "DIMENSION" KDL)
(PROGN
(SETQ PT10 (CDR (ASSOC 10 DS)))
(SETQ PT11 (CDR (ASSOC 11 DS)))
(SETQ PT13 (CDR (ASSOC 13 DS)))
(SETQ PT14 (CDR (ASSOC 14 DS)))
(SETQ N70 (CDR (ASSOC 70 DS)))
(IF (OR (= N70 32) (= N70 33) (= N70 160) (= N70 161))
(PROGN
(SETQ GOCY (ANGLE PT10 PT14))
(SETQ GOCX (+ GOCY (/ PI 2)))
)
)
(SETVAR "OSMODE" 0)
(SETQ PTI (POLAR PT GOCX 2))
(SETQ PT13I (POLAR PT13 GOCY 2))
(SETQ PT14I (POLAR PT14 GOCY 2))
(SETQ PT13N (INTERS PT PTI PT13 PT13I NIL))
(SETQ PT14N (INTERS PT PTI PT14 PT14I NIL))
(SETQ O13 (ASSOC 13 DS))
(SETQ O14 (ASSOC 14 DS))
(SETQ N13 (CONS 13 PT13N))
(SETQ N14 (CONS 14 PT14N))
(SETQ DS (SUBST N13 O13 DS))
(SETQ DS (SUBST N14 O14 DS))
(ENTMOD DS)
)
)
(SETQ DEM (+ DEM 1))
)
)
(COMMAND "UCS" "P")
(SETVAR "CMDECHO" CMD)
(SETVAR "OSMODE" OSM)
(setq *error* OLDERR) ; Restore old *error* handler
(PRINC)
)
;******************************************************************************

(DEFUN C:BD (/ CMD SS LTH DEM PT DS KDL N70 GOCX GOCY PT13 PT14 PTI
PT10 PT10I PT10N O10 N10 PT11 PT11N O11 N11 KC OSM OLDERR)
(SETQ CMD (GETVAR "CMDECHO"))
(SETQ OSM (GETVAR "OSMODE"))
(SETQ OLDERR *error*
*error* myerror)
(PRINC "Chon doi tuong dimension!")
(SETQ SS (SSGET))
(SETVAR "CMDECHO" 0)
(SETQ PT (GETPOINT "Diem di chuyen den:"))
(SETQ PT (TRANS PT 1 0))
(COMMAND "UCS" "W")
(SETQ LTH (SSLENGTH SS))
(SETQ DEM 0)
(WHILE (< DEM LTH)
(PROGN
(SETQ DS (ENTGET (SSNAME SS DEM)))
(SETQ KDL (CDR (ASSOC 0 DS)))
(IF (= "DIMENSION" KDL)
(PROGN
(SETQ PT13 (CDR (ASSOC 13 DS)))
(SETQ PT14 (CDR (ASSOC 14 DS)))
(SETQ PT10 (CDR (ASSOC 10 DS)))
(SETQ PT11 (CDR (ASSOC 11 DS)))
(SETQ N70 (CDR (ASSOC 70 DS)))
(IF (OR (= N70 32) (= N70 33) (= N70 160) (= N70 161))
(PROGN
(SETQ GOCY (ANGLE PT10 PT14))
(SETQ GOCX (+ GOCY (/ PI 2)))
)
)
(SETVAR "OSMODE" 0)
(SETQ PTI (POLAR PT GOCX 2))
(SETQ PT10I (POLAR PT10 GOCY 2))
(SETQ PT10N (INTERS PT PTI PT10 PT10I NIL))
(SETQ KC (DISTANCE PT10 PT10N))
(SETQ O10 (ASSOC 10 DS))
(SETQ N10 (CONS 10 PT10N))
(SETQ DS (SUBST N10 O10 DS))
(SETQ PT11N (POLAR PT11 (ANGLE PT10 PT10N) KC))
(SETQ O11 (ASSOC 11 DS))
(SETQ N11 (CONS 11 PT11N))
(SETQ DS (SUBST N11 O11 DS))
(ENTMOD DS)
)
)
(SETQ DEM (+ DEM 1))
)
)
(COMMAND "UCS" "P")
(SETVAR "CMDECHO" CMD)
(SETVAR "OSMODE" OSM)
(setq *error* OLDERR)
(PRINC)
)

  • 1

Lisp In bản vẽ hàng loạt:
http://www.cadviet.c...ndpost&p=139860


#1710 hdg2318

hdg2318

    biết lệnh mirror

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

Đã gửi 07 September 2010 - 06:22 PM

Chào bạn hdg2318,
Hề hề hề, cứ thế có phải dễ người dễ ta không hỉ.
Đây là cái tớ xào nấu ra từ cái bạn gửi. Bạn coi có dùng được không, có cần thêm mắm muối chi nữa thì bạn cứ thêm cho vừa miệng hỉ.
Bạn lưu ý rằng việc nhập text theo bảng của bạn phải nhập cho đàng hoàng, hàng ra hàng mà cột ra cột chớ có lèm nhèm thò ra thụt vô, nhấp lên nhỏm xuống là lisp nó chê đó. Khoảng rộng cột cần nhập ở đây chính là cái khoảng cách từ cốt thứ hai đến cột kết quả. Mình để cho bạn tùy nhập cho sướng, muốn chỗ mô cũng được . Hề hề hề.
Còn cái lisp bạn gửi là lisp chia chớ nhân cái chi đâu. Cái đó cũng không đúng với cái yêu cầu bạn post lắm vì nó chèn đúng vào chỗ số nhân chớ không cho ra cột kết quả khác như bạn post trên hình. Tuy nhiên với trình độ của bạn thì việc sửa nó chả khó gì mình để bạn tự làm nha.


(defun c:nhantxt (/ ss1 ss2 lsn1 lsn2 lsn wid y y1 k m as h g l p pt kq num num1)
(command "undo" "be")
(alert "\n Chon cot text thu nhat")
(setq ss1 (ssget (list (cons 0 "TEXT"))))
(txt2n ss1)
(setq lsn1 lsn)
(alert "\n Chon cot text thu hai")
(setq ss2 (ssget (list (cons 0 "TEXT"))))
(txt2n ss2)
(setq lsn2 lsn
wid (getreal "\n Nhap khoang rong cot can nhap: ")
)
(foreach num lsn1
(setq y (caddr (assoc 10 (entget (car num))))
k (cadr num)
)
(foreach num1 lsn2
(setq y1 (caddr (assoc 10 (entget (car num1))))
m (cadr num1)
)
(if (= y1 y)
(progn
(setq kq (* m k)
as (entget (car num1))
h (cdr (assoc 40 as))
g (cdr (assoc 50 as))
l (cdr (assoc 8 as))
p (assoc 10 as)
pt (list (+ wid (cadr p)) y1 (cadddr p))
)
(entmake (list (cons 0 "TEXT") (cons 1 (rtos kq 2 1)) (cons 10 pt) (cons 40 h) (cons 50 g) (cons 8 l)))
)
)
)
)
(command "undo" "e")
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun txt2n (ss / n i num e el )
(setq n (sslength ss )
i 0
lsn (list)
)
(While (< i n)
(setq e (ssname ss i)
el (entget e)
num (atof (cdr (assoc 1 el)))
lsn (append lsn (list (list e num)))
i (1+ i)
)
)
lsn
)

Hề hề hề
chúc bạn vui.


hề hề, cám ơn bác, thực chất mình chỉ cần làm việc với text thôi, ko cần gì đến bề rộng cột, khoảng cách cột cả.
biết rằng dùng Table của CAD sẽ hữu ích hơn rất nhiều, nhưng c.ty không dùng bảng của CAD bao giờ, với lại forrm của khung tên bản vẽ không cho phép dùng :bigsmile:
Thanks các bác đã giúp đỡ. :undecided: :bigsmile:
  • 0

Có 2 cách để nhìn đời:
1 là : coi như chẳng có gì là huyền diệu
2 là : coi như mọi điều đều huyền diệu


Click here


#1711 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 07 September 2010 - 09:16 PM

Nhờ TUE_NV xem dùm mình nhé!
http://www.cadviet.c...files/3/den.dwg
Thanks TUE_NV nhiều!

truongthanh thử cái này nhé :

(defun c:rbl(/ ov vl ss i j eL expss ent_blk disb dise ent dd dc);restore block
(command "undo" "be")
(IF (acet-util-ver)
(PROGN
(defun *error* (msg)
(if ov (mapcar 'setvar vl ov)); reset Sys Vars
(if (not(wcmatch (strcase msg) "*BREAK,*EXIT*,*CANCEL*"))
(princ (strcat "\n** Error: " msg " **")))
(princ))
(setq vl '("osmode" "cmdecho")
ov (mapcar 'getvar vl))
(mapcar 'setvar vl '(0 0) )
(setq ss (ssget '((0 . "LWPOLYLINE") (8 . "dien") (70 . 0))) i -1 j -1)
(if (vl-cmdf "insert" "den" '(0 0 0) "1" "1" "0")
(progn
(setq eL (entlast))
(Repeat (sslength (setq expss (acet-explode eL)))
(setq ent_blk (ssname expss (setq i (1+ i))))
(if (and (= (acet-dxf 0 (entget ent_blk)) "LWPOLYLINE" )
(= (acet-dxf 70 (entget ent_blk)) 0)
(= (acet-dxf 8 (entget ent_blk)) "dien")
)
(setq disb (distance (vlax-curve-getstartpoint ent_blk)
(vlax-curve-getendpoint ent_blk)
)
)
)
(entdel ent_blk)
)
)
)
(iF ss
(while (setq ent (ssname ss (setq j (1+ j))))
(setq dd (vlax-curve-getstartpoint ent))
(setq dc (vlax-curve-getendpoint ent))
(setq dise (distance dd dc) ang (/ (* 180 (- (angle dd dc) (/ pi 2))) pi))
(vl-cmdf "erase" (ssget "f" (list dd dc)) "")
(vl-cmdf "insert" "den" dd (/ dise disb) (/ dise disb) ang)
)
);iF
)
(alert "Chua cai Express")
);PROGN_IF
(mapcar 'setvar vl ov)
(command "undo" "end")
(princ)
)

:undecided:
  • 1

#1712 bachngoctung

bachngoctung

    biết lệnh copy

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

Đã gửi 07 September 2010 - 10:57 PM

- MÌnh có vấn đề này mong các bạn giúp đỡ (xem hình ảnh nhé)
- Bản vẽ của mình các đối tượng text đã bị dịch chuyển khỏii hướng ban đầu tức các giá trị Text alignment X, Text alignment Y, Text alignment Z, khác không . Chính vì thế nên mình không sử dụng được lisp nội suy cao độ giữa 3 điểm , do khi sử dụng thì giá trị nội suy nó bịn nhảy về vị trí mà
tại dó Text alignment X=0, Text alignment Y=0, Text alignment Z =0 . Mình đã thử khắc phục bằng cách move về đúng hướng text ban đầu NHUNG khổ nỗi mỗi giá trị text trong bản vẽ nó bị lệch khỏi hướng ban đầu là khác nhau NÊN ko thể làm thủ công được. Mong các bạn nghiên cứu giúp mình với . Cám on nhiều :undecided:
- Ðây là hình ảnh và file minh họa+ lisp nội suy(tên lệnh ns) (file sannen.vlx )
- File cad và lisp nếu cần có thể down tại đây:
http://www.cadviet.c...t_alignment.dwg
http://www.cadviet.c...es/3/sannen.rar

Hình đã gửi
  • 0

#1713 truongthanh

truongthanh

    biết lệnh text

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

Đã gửi 07 September 2010 - 11:58 PM

truongthanh thử cái này nhé :


(defun c:rbl(/ ov vl ss i j eL expss ent_blk disb dise ent dd dc);restore block
(command "undo" "be")
(IF (acet-util-ver)
(PROGN
(defun *error* (msg)
(if ov (mapcar 'setvar vl ov)); reset Sys Vars
(if (not(wcmatch (strcase msg) "*BREAK,*EXIT*,*CANCEL*"))
(princ (strcat "\n** Error: " msg " **")))
(princ))
(setq vl '("osmode" "cmdecho")
ov (mapcar 'getvar vl))
(mapcar 'setvar vl '(0 0) )
(setq ss (ssget '((0 . "LWPOLYLINE") (8 . "dien") (70 . 0))) i -1 j -1)
(if (vl-cmdf "insert" "den" '(0 0 0) "1" "1" "0")
(progn
(setq eL (entlast))
(Repeat (sslength (setq expss (acet-explode eL)))
(setq ent_blk (ssname expss (setq i (1+ i))))
(if (and (= (acet-dxf 0 (entget ent_blk)) "LWPOLYLINE" )
(= (acet-dxf 70 (entget ent_blk)) 0)
(= (acet-dxf 8 (entget ent_blk)) "dien")
)
(setq disb (distance (vlax-curve-getstartpoint ent_blk)
(vlax-curve-getendpoint ent_blk)
)
)
)
(entdel ent_blk)
)
)
)
(iF ss
(while (setq ent (ssname ss (setq j (1+ j))))
(setq dd (vlax-curve-getstartpoint ent))
(setq dc (vlax-curve-getendpoint ent))
(setq dise (distance dd dc) ang (/ (* 180 (- (angle dd dc) (/ pi 2))) pi))
(vl-cmdf "erase" (ssget "f" (list dd dc)) "")
(vl-cmdf "insert" "den" dd (/ dise disb) (/ dise disb) ang)
)
);iF
)
(alert "Chua cai Express")
);PROGN_IF
(mapcar 'setvar vl ov)
(command "undo" "end")
(princ)
)

:undecided:

chỉ biết nói 2 từ cảm ơn tuyệt vời!
Lisp này đúng với file CAD mình gửi!
Nhưng cho mình hỏi sao mình dùng với 1 block hình dạng khác (ví dụ block hình tròn hoặc hình vuông) cũng tên DEN luôn thì khi select object thì báo 0 found là sao vậy TUE_NV?hay là lisp này chỉ đúng với file CAD mình gửi thôi?
Thanks TUE rất nhiều!
  • 0

#1714 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 08 September 2010 - 01:07 AM

Hề hề hề,
Vậy là bạn biết rồi, xin lỗi vì mình cầm đèn chạy trước ô tô. Hề hề hề.
Cái ý của bạn như vậy bạn có thể làm như sau:
1/- Chọn tập hợp gồm tất cả các đối tượng bạn muốn kiểm tra.
2/- Dùng vòng lặp while lặp qua tất cả các đối tượng có trong tập hợp đối tượng đã được chọn.
3/-trong quá trình lặp này bạn dùng hàm if để kiểm tra xem đối tượng có phải là block không, nếu đúng bạn explode nó ra, còn nếu không thì mặc xác nó bơ vơ.
4/- kết thúc vòng lặp.

Do bạn cũng đã có khả năng viết được nên bạn hãy thử viết theo hướng như tren xem sao. Nếu gặp khó khăn hãy post lên mọi nhười sẽ giúp bạn nhé.

Cám ơn bạn phamthanhbinh đã chỉ giáo
mình viết code thế này có đúng không vậy bạn

(defun c:exbl ()
(setq ssb (ssget))
(setq n (sslength ssb))
(setq i 0)
(while (< i n)
(setq n (sslength ssb))
(setq ent (ssname ssb i))
(setq name (cadr (entget ent)))
(if (equal name '(0 . "INSERT"))
(progn
(command "explode" ent)
(setq ssc (ssget "p"))
(setq n1 (sslength ssc))
(setq i1 0)
(while (< i1 n1)
(setq ent1 (ssname ssc i1))
(setq ssb (ssadd ent1 ssb))
(setq i1 (1+ i1))
)
)
)
(setq i (1+ i))
(setq n (sslength ssb))
)
)

Bạn cũng cho mình hỏi thêm phát
làm thế nào để explode thằng block đã scale théo trục x,y mà trong thằng đó có block.
Có code nào thay thế lệnh align không. code của mình viết nó toàn báo lỗi khi sử dụng 4 lần lệnh align.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#1715 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 08 September 2010 - 05:57 AM

chỉ biết nói 2 từ cảm ơn tuyệt vời!
Lisp này đúng với file CAD mình gửi!
Nhưng cho mình hỏi sao mình dùng với 1 block hình dạng khác (ví dụ block hình tròn hoặc hình vuông) cũng tên DEN luôn thì khi select object thì báo 0 found là sao vậy TUE_NV?hay là lisp này chỉ đúng với file CAD mình gửi thôi?
Thanks TUE rất nhiều!

Lisp chỉ đúng với file CAD bạn gửi thôi. Tue_NV đã nói rồi : Cái vụ Khôi phục Block này rất khó xử. Tùy từng trường hợp mà xử lý nó vậy. Bạn upload file có block đèn hình tròn hoặc hình vuông lên đây để khôi phục nó 1 luôn nhé. Không biết xử lý nó được không nữa, có những trường hợp bó tay.com <_<

Truong thanh chú ý rằng Lisp có thể áp dụng với Block Explode đã bị scale nữa đó nhé. Tuy nhiên, với trường hợp Block Explode bị scale theo 2 phương X và Y là khác nhau thì không còn đúng nữa.
  • 1

#1716 master_worse

master_worse

    biết lệnh offset

  • Advance Member
  • PipPipPip
  • 170 Bài viết
Điểm đánh giá: 87 (tàm tạm)

Đã gửi 08 September 2010 - 08:47 AM

Cám ơn bạn phamthanhbinh đã chỉ giáo
mình viết code thế này có đúng không vậy bạn


(defun c:exbl ()
(setq ssb (ssget))
(setq n (sslength ssb))
(setq i 0)
(while (< i n)
(setq n (sslength ssb))
(setq ent (ssname ssb i))
(setq name (cadr (entget ent)))
(if (equal name '(0 . "INSERT"))
(progn
(command "explode" ent)
(setq ssc (ssget "p"))
(setq n1 (sslength ssc))
(setq i1 0)
(while (< i1 n1)
(setq ent1 (ssname ssc i1))
(setq ssb (ssadd ent1 ssb))
(setq i1 (1+ i1))
)
)
)
(setq i (1+ i))
(setq n (sslength ssb))
)
)


Bạn thử cái này xem nhé:
(defun c:exbl ()
(setq ss (ssget '((0 . "INSERT"))))
(command ".explode" ss "")
(princ)
)
  • 0

Ngu dốt không đáng thẹn bằng thiếu ý chí học hỏi


Tri thức làm người ta khiêm tốn, ngu si làm người ta kiêu ngạo (Ngạn ngữ Anh)


#1717 truongthanh

truongthanh

    biết lệnh text

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

Đã gửi 08 September 2010 - 09:15 AM

Lisp chỉ đúng với file CAD bạn gửi thôi. Tue_NV đã nói rồi : Cái vụ Khôi phục Block này rất khó xử. Tùy từng trường hợp mà xử lý nó vậy. Bạn upload file có block đèn hình tròn hoặc hình vuông lên đây để khôi phục nó 1 luôn nhé. Không biết xử lý nó được không nữa, có những trường hợp bó tay.com <_<

Truong thanh chú ý rằng Lisp có thể áp dụng với Block Explode đã bị scale nữa đó nhé. Tuy nhiên, với trường hợp Block Explode bị scale theo 2 phương X và Y là khác nhau thì không còn đúng nữa.

cảm ơn TUE nhiều!cái vụ block hình tròn hoặc hình vuông là mình test thử thôi!chứ tạm thời là bản vẽ của mình dùng mấy block đèn thì đã làm được rồi!sau này nếu mình gặp phải những dạng block khác thì chắc phải làm phiền đến TUE nữa rồi!(mình thấy khi thực hiện lệnh lisp thì select object là nó chọn cái Pline đúng ko?)
Thanks TUE nhiều và chúc sức khỏe TUE!
  • 0

#1718 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 08 September 2010 - 10:29 AM

Bạn thử cái này xem nhé:
(defun c:exbl ()
(setq ss (ssget '((0 . "INSERT"))))
(command ".explode" ss "")
(princ)
)

Cám ơn bạn đã quan tâm.
Vấn đề của mình là nhóm đối tượng ssb của mình không có block nào trong đó. nếu có thì explode nó ra và thêm các phần tử đã explode vào nhóm đối tượng ssb. Vấn đề này mình đã giải quyết được như lisp trên rồi. Bởi vì mình dùng biến ssb vào mục đích khác nữa.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#1719 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:50 AM

Cám ơn bạn phamthanhbinh đã chỉ giáo
mình viết code thế này có đúng không vậy bạn


(defun c:exbl ()
(setq ssb (ssget))
(setq n (sslength ssb))
(setq i 0)
(while (< i n)
(setq n (sslength ssb))
(setq ent (ssname ssb i))
(setq name (cadr (entget ent)))
(if (equal name '(0 . "INSERT"))
(progn
(command "explode" ent)
(setq ssc (ssget "p"))
(setq n1 (sslength ssc))
(setq i1 0)
(while (< i1 n1)
(setq ent1 (ssname ssc i1))
(setq ssb (ssadd ent1 ssb))
(setq i1 (1+ i1))
)
)
)
(setq i (1+ i))
(setq n (sslength ssb))
)
)

Bạn cũng cho mình hỏi thêm phát
làm thế nào để explode thằng block đã scale théo trục x,y mà trong thằng đó có block.
Có code nào thay thế lệnh align không. code của mình viết nó toàn báo lỗi khi sử dụng 4 lần lệnh align.

Chào bạn Phamngoctukts,
1/ Về cái đoạn lisp bạn đã viết xin có vài góp ý như sau:
- Trong vòng lặp while, cái đoạn code (setq n (sslength ssb)) là không cần thiết nữa vì nó đã có ở trên và lisp đã xác định được n là gì rồi.
- Đoạn code (setq name (cadr (entget ent))) nên thay là (setq name (assoc 0 (entget ent))) vì hàm cadr là lấy phần tử thứ hai trong lít các mã dxf của đối tượng. Có một số đối tượng thì cái tên của nó không nằm ở vị trí thứ hai. Bạn cũng có thể dùng chi tiết hơn là (setq name (cdr(assoc 0 (entget ent)))) nhưng khi đó trong hàm điều kiện if bạn phải đổi lại là (if (= name "INSERT").....
- Việc bạn thêm hàm (setq n (sslength ssb)) vào cuối chương trình sẽ làm cho chương trình chạy lâu hơn mức cần thiết rất nhiều do sau mỗi bước lặp bạn lại gán thêm các đối tượng vừa được explode vào tập chọn ssb ở code sau: (setq ssb (ssadd ent1 ssb)). Việc làm này mình chưa rõ mục đích của bạn song theo cách suy nghĩ của mình thì có vẻ như là thừa bạn ạ vì cái tập chọn ssb chả cần thiết phải dính líu tới các đối tượng vừa explode ra để làm gì. Nếu bạn muốn trừng phạt chúng thì nhét nó vào một tập chọn khác sẽ tiện hơn.
2/- Việc xử lý các block nằm trong block với cùng một cách xử lý thì bạn có thể dùng phép đệ qui mà bác Tue_NV và các bác khác trên diễn đàn đã chỉ. Nó cũng nằm ngay trong topic này bạn ạ
http://www.cadviet.c...o...203&st=1640
3/- Code để thay thế lệnh align theo mình là có thể có được, xong bạn phải căn cứ vào từng trường hợp cụ thể của các đối tượng, các đặc trưng riêng của đối tượng mà viết lisp bạn ạ. Nhưng nó có hay hơn , tốt hơn lệnh align không thì mình không dám chắc.... Bởi vì lệnh này là do các cao thủ có sừng có mỏ cả làm ra chứ chả phải cái giống amateur như mình đâu. Hề hề hề, Còn tại sao nó chỉ cho bạn xài có 4 lần thì mình chưa rõ vì mình cũng chưa gặp như vậy. Có thể trong các biến hệ thống của bạn có thằng mô đó nó chọc ngoáy thằng align này. hề hề hề, ấy là mình cứ đoán mò vậy. Trúng trật gì sẽ có cao thủ khác chỉ dạy thêm...
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.

#1720 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 08 September 2010 - 12:06 PM

Chào bạn Phamngoctukts,
1/ Về cái đoạn lisp bạn đã viết xin có vài góp ý như sau:
- Trong vòng lặp while, cái đoạn code (setq n (sslength ssb)) là không cần thiết nữa vì nó đã có ở trên và lisp đã xác định được n là gì rồi.
- Đoạn code (setq name (cadr (entget ent))) nên thay là (setq name (assoc 0 (entget ent))) vì hàm cadr là lấy phần tử thứ hai trong lít các mã dxf của đối tượng. Có một số đối tượng thì cái tên của nó không nằm ở vị trí thứ hai. Bạn cũng có thể dùng chi tiết hơn là (setq name (cdr(assoc 0 (entget ent)))) nhưng khi đó trong hàm điều kiện if bạn phải đổi lại là (if (= name "INSERT").....
- Việc bạn thêm hàm (setq n (sslength ssb)) vào cuối chương trình sẽ làm cho chương trình chạy lâu hơn mức cần thiết rất nhiều do sau mỗi bước lặp bạn lại gán thêm các đối tượng vừa được explode vào tập chọn ssb ở code sau: (setq ssb (ssadd ent1 ssb)). Việc làm này mình chưa rõ mục đích của bạn song theo cách suy nghĩ của mình thì có vẻ như là thừa bạn ạ vì cái tập chọn ssb chả cần thiết phải dính líu tới các đối tượng vừa explode ra để làm gì. Nếu bạn muốn trừng phạt chúng thì nhét nó vào một tập chọn khác sẽ tiện hơn.
2/- Việc xử lý các block nằm trong block với cùng một cách xử lý thì bạn có thể dùng phép đệ qui mà bác Tue_NV và các bác khác trên diễn đàn đã chỉ. Nó cũng nằm ngay trong topic này bạn ạ
http://www.cadviet.c...o...203&st=1640
3/- Code để thay thế lệnh align theo mình là có thể có được, xong bạn phải căn cứ vào từng trường hợp cụ thể của các đối tượng, các đặc trưng riêng của đối tượng mà viết lisp bạn ạ. Nhưng nó có hay hơn , tốt hơn lệnh align không thì mình không dám chắc.... Bởi vì lệnh này là do các cao thủ có sừng có mỏ cả làm ra chứ chả phải cái giống amateur như mình đâu. Hề hề hề, Còn tại sao nó chỉ cho bạn xài có 4 lần thì mình chưa rõ vì mình cũng chưa gặp như vậy. Có thể trong các biến hệ thống của bạn có thằng mô đó nó chọc ngoáy thằng align này. hề hề hề, ấy là mình cứ đoán mò vậy. Trúng trật gì sẽ có cao thủ khác chỉ dạy thêm...
Chúc bạn vui.

Chào bạn phamthanhbinh
1. đầu tiên mình cũng nghĩ như bạn là tống cái lũ đỗi tượng đã explode vào một tập chọn khác. Nhưng trong đống đó có thằng vẫn là block thì sao nhỉ.
Vậy là mình tống tất cả lũ chúng nó vào trong tậo chon ssb ban đầu để vòng lặp tiếp tục kiểm tra xem còn thằng block nào không. Nếu có thi explode ra bao giờ không còn thằng nào thì thôi.
2. Ý của bạn có phải là explode thằng block trong thằng block không?.
3. Mình cũng trả hiểu sao nữa cái code ở trên mình viết cứ sư dụng đến lần thứ tư là báo lỗi "fatal error: Commands may not be nested more than 4 deep" theo mình thì nó lỗi ở lệnh align.
Cám ơn bạn đã quan tâm!
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!