Chuyển đến nội dung
Diễn đàn CADViet
canu_a7

Nhờ viết lisp tạo block từ các đối tượng giống nhau hay từ block đã bị phá

Các bài được khuyến nghị

Chào anh em diễn đàn mình có vấn đề này mong các pro giúp đỡ trong bản vẽ của mình có rất nhiều đối tượng giống nhau có thể là do copy mà không tạo block hay từ một block đã bị phá vỡ mình muốn nhờ mọi người viết giúp mình một cái lisp nhóm các đối tượng giống nhau đó thành một block 

Xin trân thành cảm ơn và chúc anh em ngày càng tiến bộ.

  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

1). Bạn cố gắng gởi thêm một ít dấu chấm và dấu phẩy để chèn vào câu hỏi, chứ đọc một mạch khó hiểu quá.

2). Khái niệm "đối tượng giống nhau" là khá mơ hồ. Bạn có thể giải thích thêm?

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

1). Bạn cố gắng gởi thêm một ít dấu chấm và dấu phẩy để chèn vào câu hỏi, chứ đọc một mạch khó hiểu quá.

2). Khái niệm "đối tượng giống nhau" là khá mơ hồ. Bạn có thể giải thích thêm?

Hề hề hề,

Quả thật là không thể vui được khi các KỸ SƯ hay GIÁO SƯ mà lại không thể trình bày cái sự hiểu của mình cho ngưới khác hiểu được. Có nhẽ cái sự học ngày nay nó tiến bộ quá nên người học có quyền nói tất cả những gì mình khoái mà không cần người nghe phải hiểu. Và thế là một mớ kỹ sư ra đời với toàn tư tưởng ăn trên ngồi chốc.

Hề hề hề,....

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Là vì mình muốn quản lý bản vẽ bằng block nhưng khi nhận bản vẽ của người khác thì có nhiều chi tiết được người vẽ copy vô tội vạ mà không đóng block nên giờ mình muốn anh em giúp một tay làm sao gom các chi tiết đó lại thành một block cho dễ quản lý chứ giờ mà phải tạo block rồi đặt vào đúng vị trí e hơi mệt 

Đúng là mình trình bầy văn bản hơi ẩu nhưng đó không phải do mình cố ý mong bạn Đoàn Văn Hà thông cảm có gì không hiểu mọi người đều có thể trao đổi

Tư duy của người yêu cầu đến người thực hiện là khác nhau nếu chỉ giựa vào khả năng diễn đạt mà đánh giá lớp kỹ sư thời nay thì mình e là hơi võ đoán đấy bạn Phạm Thanh Bình ag

  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn hãy gởi một bản vẽ lên minh họa. Các chi tiết nào thì cần block lại, vì chúng nhau cái gì, các đối tượng cần block thuộc kiểu đối tượng gì v.v...?

Chứ chỉ diễn giải bằng lời là không hết ý đâu.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

1). Bạn cố gắng gởi thêm một ít dấu chấm và dấu phẩy để chèn vào câu hỏi, chứ đọc một mạch khó hiểu quá.

2). Khái niệm "đối tượng giống nhau" là khá mơ hồ. Bạn có thể giải thích thêm?

Mình thích comment thứ 1 của bác này, trực quan và sinh... sự quá ^^

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Là vì mình muốn quản lý bản vẽ bằng block nhưng khi nhận bản vẽ của người khác thì có nhiều chi tiết được người vẽ copy vô tội vạ mà không đóng block nên giờ mình muốn anh em giúp một tay làm sao gom các chi tiết đó lại thành một block cho dễ quản lý chứ giờ mà phải tạo block rồi đặt vào đúng vị trí e hơi mệt 

Đúng là mình trình bầy văn bản hơi ẩu nhưng đó không phải do mình cố ý mong bạn Đoàn Văn Hà thông cảm có gì không hiểu mọi người đều có thể trao đổi

Tư duy của người yêu cầu đến người thực hiện là khác nhau nếu chỉ giựa vào khả năng diễn đạt mà đánh giá lớp kỹ sư thời nay thì mình e là hơi võ đoán đấy bạn Phạm Thanh Bình ag

Hề hề hề,

Đúng là võ đoán thật. Thế` còn văn đoán của bạn thì nó thế nào nhỉ??? 

Một người muốn người khác thực hiện cái yêu cầu của mình nhưng lại không thể nói cho người thực hiện hiểu đúng cái yêu cầu của mình thì kết quả công việc ấy ra sao nhỉ?? Và lỗi này chắc hẳn là do cái anh thực hiện quá kém không thể hiểu nối cái tư duy như giời như biển của anh yêu cầu. Đúng không nhỉ????

Học đã tới cái bằng kỹ sư mà còn chưa hiểu được cái tầm quan trọng của việc truyền đạt thông tin đầy đủ và chuẩn xác thì thật là uổng công cho cái sự học.

Làm việc mà không cần người khác hiểu đúng ý mình thì chỉ có thể làm việc một mình, và như vậy thì hẳn là một cách làm việc đúng chăng???

Võ đóan hay văn đoán, chả quan trọng gì cả mà quan trọng ở cái kết quả của việc mở topic này....

Hề hề hề ,....

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Giống nhau là sao thế nhỉ ? Mình gặp khá nhiều người yêu cầu ntn, chủ yếu phát sinh từ việc k phân biệt người và máy, cứ nghĩ nhìn giống nhau thì chương trình phải nhận diện đc, nghĩ là dễ :)

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

http://www.cadviet.com/upfiles/3/46537_vi_du.dwg

 

Mong mọi người giúp đỡ thực ra đây chỉ là ý tưởng thôi nếu làm được thì sẽ rất có ích nhưng cũng có thể là nó không làm được

 

Hề hề hề,

 

Và đây là cái kết quả của việc võ đoán. Có thể nó đúng với cái văn đoán của bạn nhưng xin thưa rằng nó chỉ áp dụng cho đúng cái bản vẽ mà bạn đã post lên. Bởi vì các bản vẽ khác sẽ có những dối tượng giống nhau khác chứ chắc mẻm không phải như ở bản vẽ mẫu này. Khi đó bạn có thể phải dùng cái văn đoán của bạn để tìm ra đối tượng chuẩn cũng như cách chọn nhóm đối tượng cùng đối tượng chuẩn để tạo ra block mẫu. Trong trường hợp bản vẽ bạn post, mình võ đoán rằng cái đối tượng chuẩn là cái vòng tròn lớn nhất chứa các đối tượng bên trong và dùng nó để chọn nhóm đối tượng trong block mẫu. Sau khi có block mẫu thì mình chỉ việc xóa sạch những thằng "giống nhau" và nhét cái block mẫu này vào vị trí tương ứng của nó mà thôi.

 

Bạn cũng có thể áp dụng cái thuật toán này cho các bản vẽ khác của bạn với điều kiện phải văn đoán đúng các đối tượng chuẩn và có cách lựa chọn nhóm đối tượng phù hợp

 

{codebox]

 

 

(Defun c:blndt (/ oldos dtm lo pc d la ss ss1 ss2 bln)

(vl-load-com)

(setq oldos (getvar "osmode"))

(setvar "osmode" 0)

(command "undo" "be")

(setq dtm (car (entsel "\n Chon doi tuong chuan"))

          lo (cdr (assoc 0 (entget dtm)))

          pc (cdr (assoc 10 (entget dtm)))

          d (cdr (assoc 40 (entget dtm)))

          la (cdr (assoc 8 (entget dtm)))

          ss (ssget "w" (list (- (car pc) (+ d  0.01)) (- (cadr pc) (+  d  0.01))) (list (+ (car pc) d 0.01) (+ (cadr pc) d 0.01)))  )

(setq bln (getstring T "\n Nhap ten block: " ))

(if (not (tblsearch "block" bln))

    (command "block" bln pc ss "")

    (progn 

          (alert "\n Ten block da co,  yeu cau nhap ten khac " )

          (setq bln nil)

    )

)

(while (/= bln nil)

(setq ss1 (acet-ss-to-list (ssget (list (cons 0 lo) (cons 8 la) (cons 40 d)))))

(foreach en ss1

       (setq pt (cdr (assoc 10 (entget en)))

                ss2 (ssget "w" (list (- (car pt) (+ d 0.01)) (- (cadr pt) (+ d  0.01))) (list (+ (car pt) d 0.01) (+ (cadr pt) d  0.01)))  )

       (command "erase" ss2 "")

       (command "insert" bln pt 1 1 0)

)

(command "insert" bln pc 1 1 0)

 (setq bln nil)

)

(command "undo" "e")

(setvar "osmode" oldos)

(princ)

)

       

[/codebox]

Hề hề hề,

Chúc bạn vui và hãy cố gắng học cách diễn đạt làm sao để mọi người không thể võ đoán hay văn đoán bạn nhé. Cái việc bắt mọi người phải võ đoán hay văn đoán như vậy được mình coi là việc ăn trên ngồi chốc coi thường đồng đội đó bạn ạ.

  • Vote tăng 2
  • Vote giảm 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tuyệt vời! Nếu lisp này được khái quát lên và đúng cho mọi trường hợp thì nó xứng đáng được AutoDesk mua lại để bổ sung vào tùy chọn của lệnh Purge. Theo mình, đây là một cách tuyệt vời để giảm dung lượng bản vẽ!

P/S: Code của bạn nhiều dòng trống quá!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tuyệt vời! Nếu lisp này được khái quát lên và đúng cho mọi trường hợp thì nó xứng đáng được AutoDesk mua lại để bổ sung vào tùy chọn của lệnh Purge. Theo mình, đây là một cách tuyệt vời để giảm dung lượng bản vẽ!

P/S: Code của bạn nhiều dòng trống quá!

 

Chắc là không bao giờ đúng được cho mọi trường hợp đâu bạn à.

Block là đối tượng phức, chứa nhiều đối tượng khác nhau, đúng trong TH này, nhưng không đúng trong TH khác, 

tùy từng TH có cách xử lý khác nhau

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tuyệt vời! Nếu lisp này được khái quát lên và đúng cho mọi trường hợp thì nó xứng đáng được AutoDesk mua lại để bổ sung vào tùy chọn của lệnh Purge. Theo mình, đây là một cách tuyệt vời để giảm dung lượng bản vẽ!

P/S: Code của bạn nhiều dòng trống quá!

Hề hề hề,

Không phải đâu là không phải đâu. Lỗi do cái codebox của diễn đàn đó. Chả hiểu sao mà nó lại nhảy cách như thế.

Diễn đàn đã thay thế thẻ {code] [/code] bằng thẻ {lisp] [/lisp] nhưng sao mình dùng nó vẫn không xi nhê gì cả nên đành chơi thẻ

 

.

Hề hề hề

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Trước tiên mình nợ Phạm Thanh Bình một lời cảm ơn vì đã giúp đỡ quả thật diễn đàn phát triển được là nhờ những người như bạn cho dù những lời nhận xét có là hơi nghiêm khắc nhưng để tiến bộ thì ta phải cố gắng thôi.

Mình đã tải lisp về chạy thử với những hình giống nhau thì lisp chạy ổn định nhưng khi trong hình mà có thêm đối tượng khác thì lisp bị lỗi mong Phạm Thanh Bình cố gắng fix hộ lỗi này 

một lần nữa xin chân thành cảm ơn!http://www.cadviet.com/upfiles/3/46537_vi_du.rar

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

lisp không nhận những đối tượng có đường bao là PLine

1/- Cái ni là do bạn không đọc kỹ hướng dẫn trước khi sử dụng mừ.

2/- Hãy gửi cái bản vẽ có đường bao là Pline lên nhé. may ra mình gộp được nó vào cái lisp trên, nếu không thì chơi lisp khác vậy.

3/- Vấn đề cốt lõi của cái lisp này là cách xác định đối tượng chuẩn và từ đó xác định nhóm các đối tượng có trong block. Với các đối tượng chuẩn khác nhau thì phải có cách chọn các đối tượng trong block khác nhau. Vì thế nó chỉ là gợi ý để bạn có thể ứng phó với từng bản vẽ cụ thể của bạn.

Trong bản vẽ bạn gửi, mình chọn đối tượng chuẩn là vòng tròn lớn nhất và nhóm đối tượng trong block được chọn phụ thuộc vào bán kinh của vòng tròn này. Với đối tượng chuẩn là pline thì cách chọn nhóm đối tượng trong block sẽ phải khác đi. Khác như thế nào thì lại cần có bản vẽ của bạn mới võ đoán được. 

Do không thể biết được bạn sẽ cần block những loại đối tượng nào và cách chọn đối tượng chuẩn của bạn nên rất khó để có thể có được một lisp sử dụng đúng cho mọi trường hợp. Nếu có thể bạn phải thống kê được tất cả những gì bạn cần thì người viết lisp mới có thể định hướng giải quyết được bạn ạ. Rất mong bạn thông cảm với sự hiểu biết hạn chế này của mình.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Những vấn đề nảy sinh mình đã cho trong này rồi nhé

mong bạn Phan Thanh Bình động não tiếp giúp mình và những người quan tâm

http://www.cadviet.com/upfiles/3/46537_vi_du_tiep.rar

Hề  hề hề,

1/- Bạn hình như không đọc lisp nên không hiểu cơ chế làm việc của lisp này.

Nó thay thế các nhóm đối tượng giống nhau bởi một block được tạo từ một nhóm đối tượng chuẩn. Do vậy nếu nhóm đối tượng cần thay thế không hoàn toàn giống với nhóm đối tượng chuẩn thì đương nhiên nó sẽ mất đi các đặc tính riêng của nó mà chỉ còn các đặc tính y chang nhóm đối tượng chuẩn mà thôi hoặc nó sẽ bị bổ sung thêm các đặc tính riêng của nhóm đối tượng chuẩn. 

Vì thế khi sử dụng cần phải chọn đối tượng chuẩn phù hợp. Đây là việc khó nhất để lisp có thể làm việc đúng.

2/- Lisp này được sử dụng với đường bao ngoài là vòng tròn. Nếu muốn sử dụng với các đường bao ngoài là polyline thì cần phải bổ xung kha khá code nữa. Vì thế trước mắt nếu bạn muốn dùng nó với các đường bao là polyline bạn có thể tạo thêm một vòng tròn bao ngoài các nhóm đối tượng đó rồi sử dụng. Sau đó xoá vòng tròn này đi.

3/- Không thể có chuyện mất truy bắt điểm cũ bởi mình đã trả lại biến hệ thống osmode về giá trị cũ trong lisp. Co1 nhẽ bạn đã chép thiếu code chăng????

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

đúng là thời đại học mình cũng có học qua lập trình lisp nhưng không có điều kiện sử dụng nên cũng không có khả năng xem file lisp nữa chỉ biết dùng thôi và lại nhìn Phạm Thanh Bình và các pro ở đây thì nản luôn không biết bao giờ mới được như mọi người

tiện đây mình cũng có ý kiến này chúng ta đã có công cụ chọn đối tượng rất mạnh là quick select và filter vậy tại sao ta lại không làm một cái lisp hiện layiso các đối tượng được chọn (chỉ hiện các đối tượng được chọn) để có thể dễ dàng quản lý chỉnh sửa nhỉ

nếu có thể mong Phạm Thanh Bình ra tay một lần nữa 

mình tự hỏi không biết có phải lập một topic mới không nhỉ

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

đúng là thời đại học mình cũng có học qua lập trình lisp nhưng không có điều kiện sử dụng nên cũng không có khả năng xem file lisp nữa chỉ biết dùng thôi và lại nhìn Phạm Thanh Bình và các pro ở đây thì nản luôn không biết bao giờ mới được như mọi người

tiện đây mình cũng có ý kiến này chúng ta đã có công cụ chọn đối tượng rất mạnh là quick select và filter vậy tại sao ta lại không làm một cái lisp hiện layiso các đối tượng được chọn (chỉ hiện các đối tượng được chọn) để có thể dễ dàng quản lý chỉnh sửa nhỉ

nếu có thể mong Phạm Thanh Bình ra tay một lần nữa 

mình tự hỏi không biết có phải lập một topic mới không nhỉ

Hề hề hề,

Cái này trên diễn đàn có rồi gọi là lisp ẩn hiện các đối tượng được chọn. Bạn hãy cố gắng tìm kiếm nhé.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Những vấn đề nảy sinh mình đã cho trong này rồi nhé

mong bạn Phan Thanh Bình động não tiếp giúp mình và những người quan tâm

http://www.cadviet.com/upfiles/3/46537_vi_du_tiep.rar

Hề hề hề,

Đây là lisp mở rộng cho phép chọn đường bao là đường lwpolyline. Cách sử dụng tương tự như lisp cũ. Bạn phải lưu ý rằng các nhóm đối tượng cần block phải đảm bảo hoàn toàn giống với nhóm đối tượng bạn chọn làm mẫu chuẩn ban đầu.

Bạn hãy cố gắng tìm hiểu thêm về lisp để có thể làm chủ được công việc của bạn. Chúc bạn thành công.

 

(Defun c:blndt (/ oldos dtm lo pc d la ss ss1 ss2 bln pt plst pls1)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq dtm (car (entsel "\n Chon doi tuong chuan"))
          lo (cdr (assoc 0 (entget dtm)))
)
(if (= lo "CIRCLE")
    (setq pc (cdr (assoc 10 (entget dtm)))
          d (cdr (assoc 40 (entget dtm)))
          la (cdr (assoc 8 (entget dtm)))
          ss (ssget "w" (list (- (car pc) (+ d  0.01)) (- (cadr pc) (+  d  0.01))) (list (+ (car pc) d 0.01) (+ (cadr pc) d 0.01)))  )
    (if (= lo "LWPOLYLINE")
          (setq plst (acet-geom-vertex-list dtm)
                   pc (car plst)
                   la (cdr (assoc 8 (entget dtm)))
                   d (cdr (assoc  90 (entget dtm)))
                   ss (ssget "wp" plst)  )
    )
)
(setq bln (getstring T "\n Nhap ten block: " ))
(if (not (tblsearch "block" bln))
    (command "block" bln pc ss dtm "")
    (progn 
          (alert "\n Ten block da co,  yeu cau nhap ten khac " )
          (setq bln nil)
    )
)
(while (/= bln nil)
      (if (= lo "CIRCLE")
          (progn 
                (setq ss1 (acet-ss-to-list (ssget (list (cons 0 lo) (cons 8 la) (cons 40 d)))))
                (foreach en ss1
                        (setq pt (cdr (assoc 10 (entget en)))
                                  ss2 (ssget "w" (list (- (car pt) (+ d 0.01)) (- (cadr pt) (+ d  0.01))) (list (+ (car pt) d 0.01) (+ (cadr pt) d  
 
0.01)))  )
                        (command "erase" ss2 "")
                        (command "insert" bln pt 1 1 0)
                )
          )
          (if (= lo "LWPOLYLINE")
               (progn
                        (setq ss1 (acet-ss-to-list (ssget (list (cons 0 lo) (cons 8 la) (cons 90 d)))))
                        (foreach en ss1
                                (setq pt (car (setq pls1 (acet-geom-vertex-list en)))
                                          ss2 (ssget "wp" pls1)  )
                                (command "erase" ss2 en "")
                                (command "insert" bln pt 1 1 0)
                        )
               )
         )
     )
     (command "insert" bln pc 1 1 0)
     (setq bln nil)
)
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)
       

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cảm ơn Phạm Thanh Bình đã động viên có lẽ sau vụ này mình cũng phải cố gắng học hỏi thêm về Auto lisp 

còn về phần lisp hiện Iso đối tượng thì không biết Pham Thanh Binh có hiểu sai ý của mình không nếu ý của PTB là lisp vis &invis thì nó chưa đúng ý mình lắm vì lisp này chỉ có thể ẩn và hiện đối tượng chứ chưa thể hiện iso đối tượng

một lần nữa cảm ơn đã nhiệt tình giúp đỡ!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×