Đến nội dung


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

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)


  • Please log in to reply
2849 replies to this topic

#821 duchieu0205

duchieu0205

    biết vẽ line

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

Đã gửi 11 August 2011 - 02:44 PM

Block có ATT thì mã dxf 66 sẽ là 1, do vậy bạn có thể dùng hàm SSGet với Filter sau :

Cám ơn anh Ketxu nhiều!
Anh Ketxu ơi anh chỉ giùm mã dxf nào để phân biệt block cho phép explode hoặc không explode block vậy?
  • -1

#822 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 16 August 2011 - 03:51 PM

Tôi có 1 đường 2D (line, pline hoặc spline) và 2 điểm p1, p2. Làm sao để tìm giao của đường đó với đoạn thẳng nối p1 và p2.
Điều kiện: không cho phép tạo line tạm nối p1 và p2. Ai biết xin chỉ giùm!
  • 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.


#823 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 16 August 2011 - 04:06 PM

Tôi có 1 đường 2D (line, pline hoặc spline) và 2 điểm p1, p2. Làm sao để tìm giao của đường đó với đoạn thẳng nối p1 và p2.
Điều kiện: không cho phép tạo line tạm nối p1 và p2. Ai biết xin chỉ giùm!

Với điều kiện như trên thì chỉ còn cách giải hệ Phưong trình (hình học giải tích) gồm:
- PT bậc nhất đi qua 2 điểm cho trước
- PT bậc 1,2,3 ... của đuờng 2D (vấn đề lại bị tắc ở đây : làm thế nào xác định đuợc PT của đuờng 2D này ?!)
  • 1

#824 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 16 August 2011 - 04:27 PM

Với điều kiện như trên thì chỉ còn cách giải hệ Phưong trình gồm (hình học giải tích):
- PT bậc nhất đi qua 2 điểm cho trước
- PT bậc 1,2,3 ... của đuờng 2D (vấn đề lại bị tắc ở đây : làm thế nào xác định đuợc PT của đuờng 2D này ?!)

Với LINE hay với PLINE thì có ý tưởng anh ạ, nhưng còn với SPLINE hoặc với Curve cong thì chịu thua.
Cách giải với LINE hay với PLINE (tìm giao điểm bằng hàm Inters)
1. Với LINE đơn giản là tìm điểm đầu với điểm cuối của LINE rồi tìm giao của P1P2 với LINE bằng hàm INTERS
2. Với PLINE : Duyệt qua từng đoạn thẳng của PLINE -> Lấy 2 điểm đầu và cuối của segment -> Tìm giao của đoạn thẳng với P1P2 nếu = NIL thì tìm tiếp -> . Điểm giao là các điểm mà hàm Inters trả về.
  • 1

#825 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 16 August 2011 - 04:52 PM

Cám ơn 2 Bác Gia_Bach và Tue_NV!
Với Line thì dễ, với PLINE không Curve thì như Bác Tue_NV nói là cũng làm được, còn với Curve hoặc SPLINE thì chắc botay.com thôi. Khốn nỗi là tôi cần xử lý trên bản vẽ của người ta, mà nó gồm các đường Line, Pline, Spline rất không có quy luật. Nếu không thể thì chắc chơi kiểu tạo Line tạm thôi, mặc dầu kiểu này nó dẫn tới một số kết quả không ưng ý liên quan tới những vấn đề khác.
Thân thương!
  • 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.


#826 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 16 August 2011 - 05:16 PM

Cám ơn 2 Bác Gia_Bach và Tue_NV!
Với Line thì dễ, với PLINE không Curve thì như Bác Tue_NV nói là cũng làm được, còn với Curve hoặc SPLINE thì chắc botay.com thôi. Khốn nỗi là tôi cần xử lý trên bản vẽ của người ta, mà nó gồm các đường Line, Pline, Spline rất không có quy luật. Nếu không thể thì chắc chơi kiểu tạo Line tạm thôi, mặc dầu kiểu này nó dẫn tới một số kết quả không ưng ý liên quan tới những vấn đề khác.
Thân thương!

Cái này mình nghĩ là nên viết 1 hàm con cho nó:
1. Vẽ tạm 1 line qua p1 p2
2. tìm giao
3. undo lại lúc chưa vẽ line
4. trả kết quả biến giao điểm
như thế mình nghĩ chắc không ảnh hưởng gì đến bản vẽ đâu nhỉ :lol:
  • 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!

#827 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 16 August 2011 - 06:24 PM

Cái này mình nghĩ là nên viết 1 hàm con cho nó:
1. Vẽ tạm 1 line qua p1 p2
2. tìm giao
3. undo lại lúc chưa vẽ line
4. trả kết quả biến giao điểm
như thế mình nghĩ chắc không ảnh hưởng gì đến bản vẽ đâu nhỉ :lol:

Tôi đã đi y chang như Bác chỉ rồi. Tuy nhiên, cách này chán ở chỗ cái line tạm (mặc dù đã U tức thời). Do điểm p1 và p2 của tôi di động liên tục trên màn hình nên các line tạm này xuất hiện liên tục làm ngứa con mắt bên phải đỏ con mắt bên trái, thành ra mới nhờ các bác. Nếu không có cách khác thì chấp nhận nhỏ vi-ro-to vậy!
  • 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.


#828 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 August 2011 - 06:39 PM

Theo em thì :
- Tạo Line tạm với thuộc tính Visible = 0.
- TÌm giao
- Xóa (không nên undo)
Ngoài ra, vì đặc tính là p1 - giao - p2 sẽ thẳng hàng nên bác có thể chạy điểm theo bước nhảy để tìm, nhưng có thể tin là nó sẽ khiến việc bác làm dài như ngày mùa hè vậy :wub:
  • 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


#829 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 16 August 2011 - 07:18 PM

Tôi đã đi y chang như Bác chỉ rồi. Tuy nhiên, cách này chán ở chỗ cái line tạm (mặc dù đã U tức thời). Do điểm p1 và p2 của tôi di động liên tục trên màn hình nên các line tạm này xuất hiện liên tục làm ngứa con mắt bên phải đỏ con mắt bên trái, thành ra mới nhờ các bác. Nếu không có cách khác thì chấp nhận nhỏ vi-ro-to vậy!

Sao bạn không nói ngay cái này từ đầu, đưa ra điều kiện chi mà khó vậy?
Bạn có thể làm theo ý của KetXu hoặc là cách này : đảm bảo là không thấy Line đâu
Tắt Layer hiện hành đi. Vẽ Line tạm trên Layer hiện hành. Tìm giao điểm, xóa LINE là được.
Xong đâu đấy, bật đèn cho Layer hiện hành -> OK

Line vẽ trên Layer hiện hành đã bị tắt đèn tối om, chả thấy chi đâu hè? :lol:
  • 1

#830 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 16 August 2011 - 07:52 PM

Cám ơn Ketxu và Bác Tue_NV!
- Dùng erase hay hơn undo là khỏi nháy mắt ở thanh trạng thái, bây giờ mới biết được điều này Ketxu ơi!
- Vẽ trên layer tắt cũng là 1 chiêu đỡ nháy mắt trên screen!
==> khỏi tốn Vi-ro-to rồi!
Chỉ còn nháy chút xíu ở vị trí con chuột thôi (nếu không vẽ line tạm thì vị trí trỏ chuột không bị nháy).
  • 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.


#831 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 August 2011 - 08:25 PM

@bác Hạ : Vẽ trên Layer tắt thì có lợi là chỉ thao tác 1 lần đầu trong suốt quá trình chạy lisp, mà có cái thiệt nếu bản vẽ to to mà đối tượng thuộc layer đấy lại nhìu nhìu ^^
Mà e cứ tưởng thời gian entmake 1 line không đủ để bác biết là nó nháy chứ nhỉ :o
  • 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


#832 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 16 August 2011 - 08:44 PM

@bác Hạ : Vẽ trên Layer tắt thì có lợi là chỉ thao tác 1 lần đầu trong suốt quá trình chạy lisp, mà có cái thiệt nếu bản vẽ to to mà đối tượng thuộc layer đấy lại nhìu nhìu ^^
Mà e cứ tưởng thời gian entmake 1 line không đủ để bác biết là nó nháy chứ nhỉ :o

Ta có thể tạo 1 Layer tạm gọi là Layer tắt. "Tắt đèn" Layer đó rồi vẽ Line tạm trên Layer tắt đó. Khi xóa hết Line thì ta DEL Layer tạm đó đi, như vậy thì đâu có thiệt chi?

@DVH : nên sử dụng Entmake thay vì sử dụng Command để vẽ
  • 0

#833 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 16 August 2011 - 08:48 PM

@bác Hạ : Vẽ trên Layer tắt thì có lợi là chỉ thao tác 1 lần đầu trong suốt quá trình chạy lisp, mà có cái thiệt nếu bản vẽ to to mà đối tượng thuộc layer đấy lại nhìu nhìu ^^
Mà e cứ tưởng thời gian entmake 1 line không đủ để bác biết là nó nháy chứ nhỉ :o

1). Đã chơi chiêu thì ta tiếp tục chiêu: tạo 1 layer tạm, tắt nó, vẽ line tạm, tìm giao, xoá layer tạm ==> nó không phụ thuộc các đối twợng khác.
2). entmake nó cũng tốn vi-ro-to đấy
P/S: Bac Tue_NV đã nhanh hơn rồi
  • 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.


#834 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 August 2011 - 09:24 PM

Ta có thể tạo 1 Layer tạm gọi là Layer tắt. "Tắt đèn" Layer đó rồi vẽ Line tạm trên Layer tắt đó. Khi xóa hết Line thì ta DEL Layer tạm đó đi, như vậy thì đâu có thiệt chi?

@DVH : nên sử dụng Entmake thay vì sử dụng Command để vẽ



1). Đã chơi chiêu thì ta tiếp tục chiêu: tạo 1 layer tạm, tắt nó, vẽ line tạm, tìm giao, xoá layer tạm ==> nó không phụ thuộc các đối twợng khác.
2). entmake nó cũng tốn vi-ro-to đấy
P/S: Bac Tue_NV đã nhanh hơn rồi


Hề hề. Em có ý kiến gì về phương án đó đâu. Nếu là bản vẽ của mình thì xài tốt :wub: .
Nhưng về mặt bới móc thì là thế này :
- Bác tạo 1 Layer mới (entmake hoặc command) -> Set thuộc tính LayerOn cho layer là False <=> (1 hàm entmake + slot gán LayerOn / command )
- Tiếp theo tạo Line (bằng command hoặc entmakex), set thuộc tính layer cho nó là layer tạm vừa tạo <=> (1 hàm entmake + 1 slot gán Layer / command)
- Cuối cùng Purge Layer (1 command)
Vị chi là 3 bước. Có thể nghĩ đến vấn đề code dài hơn (nếu dùng entmake để tạo layer, line), chậm hơn (nếu dùng command để tạo / xóa layer, line), kiểm tra Layer, xử lý trường hợp tên layer tạm trùng tên layer có sẵn trên bản vẽ, purge layer khi xong xuôi ....vv và vv...Và tóm lại là e thấy nó hơi rườm ^^

Đằng nào cũng phải tạo Line với 1 slot thuộc tính , vậy chi bằng gom tất cả lại sử dụng (1 entmakex + slot visible) và gán Line tạo bằng 1 setq luôn ;)

(defun InVisLine (pt1 pt2)(entmakex (list (cons 0 "Line")(cons 10 (trans pt1 1 0))(cons 11 (trans pt2 1 0))(cons 60 1))))


@bác ĐVH : bác cố gắng, cố gắng dùng entmake, lần đầu thì lâu, nhưng những lần sau chỉ là copy paste. Tốc độ 2 cái này chênh nhau quá nhiều, mà entmake lại can thiệp trực tiếp vào Database mà không cần thông qua UI, không bị ảnh hưởng nhiều của các biến hệ thống liên quan đến screen.....
  • 5

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


#835 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 16 August 2011 - 09:33 PM

Mình thì toàn dùng comand mới khổ. Có bác nào có bộ entmake sẵn ko share cho e dùng chung với :lol:
  • 0

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


#836 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 17 August 2011 - 05:39 AM

Hề hề. Em có ý kiến gì về phương án đó đâu. Nếu là bản vẽ của mình thì xài tốt :wub: .
Nhưng về mặt bới móc thì là thế này :
- Bác tạo 1 Layer mới (entmake hoặc command) -> Set thuộc tính LayerOn cho layer là False <=> (1 hàm entmake + slot gán LayerOn / command )
- Tiếp theo tạo Line (bằng command hoặc entmakex), set thuộc tính layer cho nó là layer tạm vừa tạo <=> (1 hàm entmake + 1 slot gán Layer / command)
- Cuối cùng Purge Layer (1 command)
Vị chi là 3 bước. Có thể nghĩ đến vấn đề code dài hơn (nếu dùng entmake để tạo layer, line), chậm hơn (nếu dùng command để tạo / xóa layer, line), kiểm tra Layer, xử lý trường hợp tên layer tạm trùng tên layer có sẵn trên bản vẽ, purge layer khi xong xuôi ....vv và vv...Và tóm lại là e thấy nó hơi rườm ^^

Đằng nào cũng phải tạo Line với 1 slot thuộc tính , vậy chi bằng gom tất cả lại sử dụng (1 entmakex + slot visible) và gán Line tạo bằng 1 setq luôn ;)

Ketxu viết : Đằng nào cũng phải tạo Line với 1 slot thuộc tính -> Là chưa thỏa đáng đâu.
Nếu tạo rất nhiều nhiều LINE+set 1 thuộc tính so với việc tạo nhiều nhiều LINE không cần set thêm thuộc tính nào cả thì cái nào tốc độ sẽ nhanh hơn nhỉ?

Khi mà Layer tạm khi tạo nó, đồng thời set Layer tạm thành Layer hiện hành và Line vẽ trên Layer hiện hành đó. LINE đâu có cần phải set thêm thuộc tính nào nữa, phải không?

Trong trường hợp nếu sử dụng phương án này để xóa tất cả các LINE đã vẽ và Layer tạm vừa tạo thì sử dụng lệnh LAYDEL là xong
và trước đó phải Layerp rồi mới Laydel
Như vậy xóa tất cả Line tạo ra và Layer vừa tạo trong 1 lệnh chớ mấy. khỏi phải nháy mắt khi xóa LINE vậy

Tuy nhiên, thì code có rườm rà hơn 1 chút. Tue_NV vote (+) cho Ketxu vì ý này
  • 1

#837 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 17 August 2011 - 07:52 AM

Ô, đúng là nếu set layer là layer hiện hành thì không cần phải set thuộc tính cho Line nữa, vote gấp, tuy nhiên, về tốc độ thì ... chưa chắc ^^
Vì có 2 vấn đề e thấy ở đây như sau :
- Layer của đối tượng : không code trong entmake không có nghĩa là cad không phải set cho nó.
Sau khi đọc bài bác nói e cũng chột dạ test thử xem giữa (entmakex Line có cons 60) và (entmake Line thường), kết quả cũng khá bất ngờ :

Command: (defun eLine1 (p1 p2)(entmakex (list (cons 0 "Line")(cons 10 p1)(cons
11 p2)(cons 60 1))))
ELINE1

Command: (defun eLine2 (p1 p2)(entmakex (list (cons 0 "Line")(cons 10 p1)(cons
11 p2))))
ELINE2

Command: (setq p1 (getpoint) p2 (getpoint))
(-685165.0 1.60979e+006 0.0)


Command: (sosanh '((eline1 p1 p2)(eline2 p1 p2)))
Elapsed milliseconds / relative speed for 4096 iteration(s):

(ELINE1 P1 P2).....1045 / 1.03 <Nhanh nhất>
(ELINE2 P1 P2).....1076 / 1.00 <Chậm nhất>

Command: (sosanh '((eline1 p1 p2)(eline2 p1 p2)))
Elapsed milliseconds / relative speed for 16384 iteration(s):

(ELINE1 P1 P2).....1467 / 1.02 <Nhanh nhất>
(ELINE2 P1 P2).....1498 / 1.00 <Chậm nhất>

Command: (sosanh '((eline1 p1 p2)(eline2 p1 p2)))
Elapsed milliseconds / relative speed for 16384 iteration(s):

(ELINE1 P1 P2).....1466 / 1.02 <Nhanh nhất>
(ELINE2 P1 P2).....1497 / 1.00 <Chậm nhất>

Command: (sosanh '((eline1 p1 p2)(eline2 p1 p2)))
Elapsed milliseconds / relative speed for 16384 iteration(s):

(ELINE1 P1 P2).....1544 / 1.03 <Nhanh nhất>
(ELINE2 P1 P2).....1591 / 1.00 <Chậm nhất>

Command: (sosanh '((eline1 p1 p2)(eline2 p1 p2)))
Elapsed milliseconds / relative speed for 16384 iteration(s):

(ELINE1 P1 P2).....1482 / 1.01 <Nhanh nhất>
(ELINE2 P1 P2).....1498 / 1.00 <Chậm nhất>

Kết quả hoàn toàn nằm ngoài dự đoán, bác thử kiểm chứng lại xem sao :o

- Vấn đề 2 : Cơ chế của Laydel vẫn là ssget filter và command erase, thực chất vẫn là chạy vòng lặp qua tất cả các đối tượng, vì trong dữ liệu của bản vẽ, table Layer không quy định các đối tượng thuộc nó, mà chỉ có các đối tượng riêng biệt có gán thêm dòng quy định nó thuộc về layer nào thôi.
=> Nếu bác dùng laydel thì code 1 dòng, nhưng tốc độ thì....
Vấn đề xấu nhất vẫn là layer tạm trùng với layer bản vẽ, vì vậy ket mới nói nếu bản vẽ của mình thì xài tốt, không cần xử lý tên layer random + trùng tên mà chỉ cần đặt 1 cái tên rất dài ^^

P/S : e đi ra công trường thôi, tối về chém gió tiếp ^^ sai gì các bác cứ mắng, e không ngại tiếp thu đâu ^^
  • 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


#838 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 17 August 2011 - 10:39 AM

Ô, đúng là nếu set layer là layer hiện hành thì không cần phải set thuộc tính cho Line nữa, vote gấp, tuy nhiên, về tốc độ thì ... chưa chắc ^^
Vì có 2 vấn đề e thấy ở đây như sau :
- Layer của đối tượng : không code trong entmake không có nghĩa là cad không phải set cho nó.
Sau khi đọc bài bác nói e cũng chột dạ test thử xem giữa (entmakex Line có cons 60) và (entmake Line thường), kết quả cũng khá bất ngờ :

Kết quả hoàn toàn nằm ngoài dự đoán, bác thử kiểm chứng lại xem sao :o

- Vấn đề 2 : Cơ chế của Laydel vẫn là ssget filter và command erase, thực chất vẫn là chạy vòng lặp qua tất cả các đối tượng, vì trong dữ liệu của bản vẽ, table Layer không quy định các đối tượng thuộc nó, mà chỉ có các đối tượng riêng biệt có gán thêm dòng quy định nó thuộc về layer nào thôi.
=> Nếu bác dùng laydel thì code 1 dòng, nhưng tốc độ thì....
Vấn đề xấu nhất vẫn là layer tạm trùng với layer bản vẽ, vì vậy ket mới nói nếu bản vẽ của mình thì xài tốt, không cần xử lý tên layer random + trùng tên mà chỉ cần đặt 1 cái tên rất dài ^^

P/S : e đi ra công trường thôi, tối về chém gió tiếp ^^ sai gì các bác cứ mắng, e không ngại tiếp thu đâu ^^

Chưa biết kết quả như thế nào? Chưa check nữa. Bận quá. Nhưng Vote (+) cho Ketxu 1 cái đã
Ketxu có thể post hàm sosanh để anh em check thử luôn nhé
  • 0

#839 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 17 August 2011 - 04:08 PM

Tôi đang sử dụng 1 lệnh A.
Tôi dùng hàm Grread để lấy toạ độ điểm con chuột đang di chuyển trên screen, để sử dụng cho lệnh A này.
Trong quá trình thực hiện lệnh A, tôi lại muốn có 1 dòng nhập liệu xuất hiện phía góc phải dưới của trỏ chuột, di chuyển cùng với trỏ, để lấy số liệu nhập vào này dùng cho lệnh A. Không biết điều này có làm được không? Mong được chỉ giùm.
  • 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.


#840 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 17 August 2011 - 07:40 PM

Chưa biết kết quả như thế nào? Chưa check nữa. Bận quá. Nhưng Vote (+) cho Ketxu 1 cái đã
Ketxu có thể post hàm sosanh để anh em check thử luôn nhé

Đây ạ. E có sửa tí tiếng Việt cho dễ nhớ. Có thể nói rất cần thiết cho lisper khi lựa chọn phương án cho mình, nên e luôn đặt trong Contents
(defun sosanh


;;; (sosanh statements)
;;;
;;;
;;;
;;;=================================================================
;;;
;;; VD:
;;;
;;; (sosanh
;;; '(
;;; (1+ 1)
;;; (+ 1 1)
;;; (+ 1 1.0)
;;; (+ 1.0 1.0)
;;; )
;;; )
;;;
;;;=================================================================

(statements / _lset _rset _tostring _eval _princ _main)

;;;=================================================================
;;;
;;; (_LSet text len fillChar)
;;;
;;;=================================================================

(defun _lset (text len fillchar / padding result)
(setq
padding (list (ascii fillchar))
result (vl-string->list text)
) ;_ setq
(while
(< (length
(setq padding
(append padding padding)
) ;_ setq
) ;_ length
len
) ;_ <
) ;_ while
(while
(< (length
(setq result
(append result padding)
) ;_ setq
) ;_ length
len
) ;_ <
) ;_ while
(substr (vl-list->string result) 1 len)
) ;_ defun
;;;=================================================================
;;;
;;; (_RSet text len fillChar)
;;;
;;;=================================================================

(defun _rset (text len fillchar / padding result)
(setq
padding (list (ascii fillchar))
result (vl-string->list text)
) ;_ setq
(while
(< (length
(setq padding
(append padding padding)
) ;_ setq
) ;_ length
len
) ;_ <
) ;_ while
(while
(< (length
(setq result
(append padding result)
) ;_ setq
) ;_ length
len
) ;_ <
) ;_ while
(substr
(vl-list->string result)
(1+ (- (length result) len))
) ;_ substr
) ;_ defun

;;;=================================================================
;;;
;;; (_ToString x)
;;;
;;;=================================================================

(defun _tostring (x / result)
(if
(< (strlen
(setq result
(vl-prin1-to-string x)
) ;_ setq
) ;_ strlen
40
) ;_ <
result
(strcat (substr result 1 36) "..." (chr 41))
) ;_ if
) ;_ defun
;;;=================================================================
;;;
;;; (_Eval statement iterations)
;;;
;;;=================================================================
(defun _eval (statement iterations / start)
(gc)
(setq start (getvar "millisecs"))
(repeat iterations (eval statement))
(- (getvar "millisecs") start)
) ;_ defun

;;;=================================================================
;;;
;;; (_Princ x)
;;;
;;;=================================================================

(defun _princ (x)
(princ x)
(princ)
;;; forces screen update
) ;_ defun
;;;=================================================================
;;;
;;; (_Main statements)
;;;
;;;=================================================================

(defun _main

(statements / boundary iterations timings slowest fastest lsetlen rsetlen index count)

(setq
boundary 1000
iterations 1
) ;_ setq
(_princ "\U+0110ang so s\U+00E1nh t\U+1ED1c \U+0111\U+1ED9....")
(while
(or
(< (apply 'max
(setq timings
(mapcar
'(lambda (statement)
(_eval statement iterations)
) ;_ lambda
statements
) ;_ mapcar
) ;_ setq
) ;_ apply
boundary
) ;_ <
(< (apply 'min timings)
boundary
) ;_ <
) ;_ or
(setq iterations
(* 2 iterations)
) ;_ setq
(_princ ".")
) ;_ while
(_princ
(strcat
"\rElapsed milliseconds / relative speed for "
(itoa iterations)
" iteration(s):\n\n"
) ;_ strcat
) ;_ _princ
(setq
slowest (float (apply 'max timings))
fastest (apply 'min timings)
) ;_ setq
(setq lsetlen
(+ 5
(apply 'max
(mapcar (function strlen)
(setq statements
(mapcar (function _tostring)
statements
) ;_ mapcar
) ;_ setq
) ;_ mapcar
) ;_ apply
) ;_ +
) ;_ setq
(setq rsetlen
(apply 'max
(mapcar
'(lambda (ms) (strlen (itoa ms)))
timings
) ;_ mapcar
) ;_ apply
) ;_ setq

(setq
index 0
count (length statements)
) ;_ setq
(foreach pair

(vl-sort
(mapcar 'cons statements timings)
'(lambda (a B) (< (cdr a) (cdr B)))
) ;_ vl-sort
((lambda (pair / ms)
(_princ
(strcat
" "
(_lset (car pair) lsetlen ".")
(_rset
(itoa (setq ms (cdr pair)))
rsetlen
"."
) ;_ _rset
" / "
(rtos (/ slowest ms) 2 2)
(cond
((eq 1 (setq index (1+ index))) " <Nhanh nh\U+1EA5t>")
((eq index count) " <Ch\U+1EADm nh\U+1EA5t>")
("")
) ;_ cond
"\n"
) ;_ strcat
) ;_ _princ
) ;_ lambda
pair
)
) ;_ foreach
(princ)
) ;_ defun
;;;=================================================================
;;;
;;; Program is defined, let's rock and roll ...
;;;
;;;=================================================================

(_main statements)

) ;_ defun

@bác ĐVH : cái thằng grread lằng nhằng lắm ^^
  • 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