Đến nội dung


Hình ảnh
- - - - -

[Hỏi]Không explode toàn bộ chọn được một lúc


  • Please log in to reply
9 replies to this topic

#1 pdle

pdle

    biết lệnh mtext

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

Đã gửi 11 April 2012 - 02:49 AM

Em có lisp sau:

(defun c:lbl (/ ss)
(
setq ss(ssget "_X" (list (cons 0 "INSERT") (cons 8 "0,ff" )))
)
(command "explode" ss )
(princ)
)

Nhưng khi thực hiện lệnh, mặc dù ss có bao nhiêu object đi nữa thì kết quả cũng chỉ có 1 block bị explode.

Lỗi ở đâu?

http://www.cadviet.c...91_drawing1.dwg
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#2 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 11 April 2012 - 08:05 AM

Đặt biến qaflags về 1 trước khi Explode nhé :)
  • 3

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


#3 pdle

pdle

    biết lệnh mtext

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

Đã gửi 11 April 2012 - 10:23 AM

Đặt biến qaflags về 1 trước khi Explode nhé :)


1.Hay quá. Mà sao em tìm trong system variables của help không có biến qaflags nhỉ :D

2.Em đã sửa lại lisp như sau:

(defun c:lbl (/ ss oldqa)

(
setq ss(ssget "_X" (list (cons 0 "INSERT") (cons 8 "0,ff" )))
oldqa (getvar "qaflags")
)
(setvar "qaflags" 1)
(command "explode" ss "")
(setvar "qaflags" oldqa)
(princ)
)
Nhưng không hiểu sao, tất cả các exploded objects đều nằm về trên layer "0", không liên quan đến việc layer nào đang là current cả! Tại sao lại như thế?
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#4 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 11 April 2012 - 10:51 AM

...
Nhưng không hiểu sao, tất cả các exploded objects đều nằm về trên layer "0", không liên quan đến việc layer nào đang là current cả! Tại sao lại như thế?

Lệnh explode khi nổ thì layer của từng đối tượng tạo nên block sẽ trả về nguyên thuỷ (về "0" tất cả là do chúng cùng layer "0" mà thôi).
Lệnh xplode thì nổ về layer tuỳ chọn được.
  • 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.


#5 pdle

pdle

    biết lệnh mtext

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

Đã gửi 12 April 2012 - 04:17 AM

1. Em dùng xplode mà không được. Anh Hà có thể nói rõ cho em với được không ạ?

2.

((-1 . <Entity name: -16ece8>) (0 . "INSERT") (330 . <Entity
name: -170308>) (5 . "16B") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"2") (100 . "AcDbBlockReference") (2 . "demo") (10 -4.10415 21.837 0.0) (41 .
1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0)
(210 0.0 0.0 1.0))


((-1 . <Entity name: -16ee88>) (0 . "LWPOLYLINE") (330 . <Entity
name: -170308>) (5 . "137") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"2") (100 . "AcDbPolyline") (90 . 7) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0)
(10 7.18185 8.27749) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 10.7666 8.27749) (40
. 0.0) (41 . 0.0) (42 . 0.0) (10 10.7666 4.32379) (40 . 0.0) (41 . 0.0) (42 .
0.0) (10 8.51945 4.32379) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 8.51945 6.83492)
(40 . 0.0) (41 . 0.0) (42 . 0.0) (10 7.18185 6.83492) (40 . 0.0) (41 . 0.0) (42
. 0.0) (10 7.18185 8.27749) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))
Command:

Cái mã 330 kia <Entity Name ...> là gì ạ?
  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#6 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 12 April 2012 - 11:36 AM

1. Em dùng xplode mà không được. Anh Hà có thể nói rõ cho em với được không ạ?
2. Cái mã 330 kia <Entity Name ...> là gì ạ?

2. Tôi không rành về 330, chỉ biết lơ mơ.
1. Srr bạn! Lệnh Xplode thuộc Tools Exprees nên không dễ để dùng trong hàm lisp (có khi không dùng đ­ược???).
Có thể làm kiểu này (chưa ưng ý lắm) để vừa nổ vừa convert layer về layer chọn.

(defun c:lbl (/ ss oldqa lay lst)
(setq ss (ssget "x" (list (cons 0 "INSERT") (cons 8 "0,ff" )))
oldqa (getvar "qaflags"))
(setvar "qaflags" 1)
(setq lay (getstring "\nNhap Layer moi: "))
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (acet-explode ss)))))
(foreach n lst
(command "CHPROP" n "" "la" lay ""))
(setvar "qaflags" oldqa)
(princ))

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


#7 pdle

pdle

    biết lệnh mtext

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

Đã gửi 13 April 2012 - 11:02 AM

Trong lisp này, E nghĩ là có thể thay lệnh CHPROP bằng:

(defun c:lbl (/ ss oldqa lay lst ndxf)
(setq ss (ssget "x" (list (cons 0 "INSERT") (cons 8 "0,ff" )))
oldqa (getvar "qaflags"))
(setvar "qaflags" 1)
(setq lay (getstring "\nNhap Layer moi: "))
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (acet-explode ss)))))
(foreach n lst
(setq ndxf (entget n)
ndxf (subst (cons 8 lay) (assoc 8 ndxf) ndxf)
)
(entmod ndxf)
)
(setvar "qaflags" oldqa)
(princ)
)

  • 0
Share your knowledge. It is a way to achieve immortality !

***

PS: Nếu bài viết của mình có ích, xin hãy "Bình chọn cho bài viết này" nhé :D

#8 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 13 April 2012 - 11:09 AM

Trong lisp này, E nghĩ là có thể thay lệnh CHPROP bằng:


(defun c:lbl (/ ss oldqa lay lst ndxf)
(setq ss (ssget "x" (list (cons 0 "INSERT") (cons 8 "0,ff" )))
oldqa (getvar "qaflags"))
(setvar "qaflags" 1)
(setq lay (getstring "\nNhap Layer moi: "))
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (acet-explode ss)))))
(foreach n lst
(setq ndxf (entget n)
ndxf (subst (cons 8 lay) (assoc 8 ndxf) ndxf)
)
(entmod ndxf)
)
(setvar "qaflags" oldqa)
(princ)
)

OK thôi! Dùng entmod hay dùng vla-put- cũng được cả, và hay hơn là command.
  • 0

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


#9 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 April 2012 - 11:30 AM

2. Tôi không rành về 330, chỉ biết lơ mơ.
1. Srr bạn! Lệnh Xplode thuộc Tools Exprees nên không dễ để dùng trong hàm lisp (có khi không dùng đ­ược???).
Có thể làm kiểu này (chưa ưng ý lắm) để vừa nổ vừa convert layer về layer chọn.


(defun c:lbl (/ ss oldqa lay lst)
(setq ss (ssget "x" (list (cons 0 "INSERT") (cons 8 "0,ff" )))
oldqa (getvar "qaflags"))
(setvar "qaflags" 1)
(setq lay (getstring "\nNhap Layer moi: "))
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (acet-explode ss)))))
(foreach n lst
(command "CHPROP" n "" "la" lay ""))
(setvar "qaflags" oldqa)
(princ))

Nếu đã dùng Command như trên thì có thể viết không cần Foreach.

Thay dòng :
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (acet-explode ss)))))
(foreach n lst
(command "CHPROP" n "" "la" lay ""))

Bằng dòng :
(setq ss (acet-explode ss))
(command "CHPROP" ss "" "la" lay "")
  • 1

#10 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 13 April 2012 - 11:35 AM

Nếu đã dùng Command như trên thì có thể viết không cần Foreach.

Thay dòng :
(setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex (acet-explode ss)))))
(foreach n lst
(command "CHPROP" n "" "la" lay ""))

Bằng dòng :
(command "CHPROP" (acet-explode ss) "" "la" lay "")

sơ ý.
  • 0

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