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

Thaistreetz

Nhà quảng cáo
  • Số lượng nội dung

    905
  • Đã tham gia

  • Lần ghé thăm cuối

  • Ngày trúng

    29

Bài đăng được đăng bởi Thaistreetz


  1. Lisp của bác Thiep về nguyên lý thì chắc chắn sẽ chạy chính xác. thay "c" bằng "f" giúp loại bỏ hoàn toàn các đối tượng không giao với đối tượng đang xét => giảm đáng kể số vòng lặp.

    Tuy nhiên phải thực hiện zoom extend đến đối tượng trước khi chọn (ssget "f") không là có thể bị chọn thiếu đối tượng ngay. sử dụng ssget ức chế nhất điều này.

    Mình có ý kiến thêm 1 chút là cần fải kiểm soát các vị trí điểm giao đã tìm thấy, tránh trường hợp a giao với b rồi đến lần lặp sau lại b giao với a.


  2. Lisp này chậm khủng khiếp như vậy là do phương pháp tìm giao không hợp lý. hoặc bác TRUNGNGAMY áp dụng lisp này cho nhu cầu trên là không hợp lý.

    - tác giả cho lặp n lần với n là số đối tượng của tập hợp. mỗi lần lặp lấy ra 1 đối tượng.

    - với mỗi lần lặp lại duyệt lại toàn bộ số đối tượng của tập hợp xem có anh nào giao với đối tượng được chọn của bước lặp trước không. <= Chậm chính là ở đây.

    Với cách làm như thế này thì số lần phải duyệt đối tương sẽ bằng bình phương của số đối tượng. Vì vậy không thể dùng với số lượng đối tượng lớn.

    1 vd để thấy sự chênh lệch khủng khiếp khi số đối tượng tăng lên: chênh lệch số lần phải lặp giữa 200 đối tượng và 100 đối tượng là: 200x200 - 100x100 = 30000 lần lặp.

     

    mình đưa giải pháp khắc phục, các bước làm như sau:

    - cho lặp tập chọn n lần với n là số đối tượng của tập chọn. mỗi lần lặp lấy ra 1 đối tượng.

    - với mỗi lần lặp, lấy tọa độ BB của đối tượng rồi (ssget "c") trong khoảng BB đó.

    - lặp danh sách đối tượng vừa chọn rồi tìm giao của từng đối tượng với đối tượng lặp ở bước 1.

    Với tính chất bản vẽ như của bác TRUNGNGAMY thì có thể khẳng định sẽ giảm khoảng > 90% số lần phải lặp so với lisp trên. bản vẽ càng nhiều đối tượng thì tỷ lệ giảm càng tăng, thậm chí có thể giảm tới 99,99% nếu số lượng đối tượng đủ lớn.

    Với số lượng đối tượng nhỏ, phương pháp này sẽ không hiệu quả hơn phương pháp trước, thậm chí cũng có thể chậm hơn. Minh từng viết 1 lisp tìm kiếm các text cao độ trên bình đồ và xóa các text đè lên nhau chỉ để lại 1 text (mục đích cho bản vẽ thông thoáng dễ đọc), thuật toán cũng tương tự thế này.

    • Vote tăng 2

  3. - Bác bỏ hàm (princ tapgiaodiem) đi, hoặc có thể viết lại thành thế này (if tapgiaodiem (princ tapgiaodiem)). Để như hiện tại thì mỗi vòng lặp tìm giao điểm nó lại thực hiện1 lần princ, hàm này cực chậm nếu in nội dung ra màn hình.

    - Thay hàm (command "point"...) bằng 1 hàm entmake hoặc 1 hàm vla để tạo point.

    2 việc làm này có thể tăng tốc độ lên đáng kể.

    • Vote tăng 1

  4. uh. đúng như lp_hai nhận xét. Tại vì trước giờ mình chỉ sử dụng lisp cho công việc này nên ko quan tâm nhiều đến bảng properties của viewport nên không biết. Dù sao với nhu cầu tổng quát: thay đổi scale của viewport đồng thời vẫn đảm bảo thỏa mãn các yêu cầu dành cho annotations thì giải pháp lisp của mình vẫn tốt hơn bất kỳ phương pháp nào mà cad cung cấp. Nhanh - gọn - nhẹ và không bị giới hạn bởi danh sách tỷ lệ annotations. Cải tạo những gì cad cung cấp cho tốt hơn là hứng thú lập trình lisp của mình ^^


  5. Bác DVH không hiểu ý bác đang muốn nói chứ không phải bác nhầm. Đúng là việc không có con trỏ là 1 trong những điều đáng tiếc nhất của lisp, không chỉ riêng việc xử lý list mà cả các vòng lặp của lisp cũng yếu luôn. không nhảy ra nhảy vô thoải mái như những ngôn ngữ khác.

     

    @Detailing: Mình nghĩ là không phải mọi người không hứng thú đâu. Như bản thân mình, nhìn những gì bạn làm thì thích lắm. Dù rất muốn học nhưng không đủ điều kiện (tiền bạc, thời gian) để theo đuổi sư đam mê như bạn. Lisp cũng chỉ là rẽ ngang phục vụ cho công việc chính, mục đích để nối dài cái cần câu cơm ra 1 chút thôi chứ cũng không mong gì hơn ở nó, bởi ai cũng biết, so với nghề xây dựng thì nghề lập trình còn bạc hơn rất nhiều :(

    • Vote tăng 1

  6. Không hề như nhau đâu Detailing ạ.

    - Cách 1: không quan tâm đến scalelist. với bất kỳ tỷ lệ nào nhập vào ta vẫn zoom được. bản chất việc làm này không liên quan gì đến annotation scale, nó đã được hỗ trợ từ lâu trong các bản cad cũ có hỗ trợ layout.

    - Cách 2: Cái này bao gồm 2 lệnh. Đầu tiên nó thực hiện lệnh zoom scale viewport (cách 1) với tỷ lệ đúng bằng tỷ lệ mà bạn muốn thay đổi. sau đó nó mới thiết lập annotation scale của viewport đó.

    Vậy bạn phải hiểu việc làm này như thế nào? Bản chất việc làm này là bạn thay đổi tỷ lệ vẽ của các đối tượng annotative trong viewport đó. tuy nhiên chính vì đang trong viewport chứ không phải model nên để đảm bảo tính đúng đắn của kích thước các đối tượng vẽ ra cad thực hiện bước thiết lập tỷ lệ zoom của viewport cho bạn luôn. Nghĩa là cách 1 chỉ là 1 phần công việc của cách 2.

    Minh họa vui 1 chút cho dễ hiểu: Bạn chủ topic bảo, tôi muốn học để lấy bằng cấp 3. Và bạn khuyên bạn ấy: "Vậy mày học để lấy bằng đại học đi, mày sẽ có bằng cấp 3" :D

     

    Việc thiết lập theo cách này sẽ bị giới hạn bởi chính danh sách tỷ lệ (scalelist). nếu bạn muốn thiết lập tỷ lệ không có trong scalelist thì bắt buộc bạn phải thực hiện thêm 1 bước là "add scale to scalelist" bởi vậy nó không phải là thứ mà chủ topic cần. (do không sử dụng annotative object và annotation scale)

     

    Lisp mình post bên trên chính là việc thực hiện tuần tự theo cách 2 này. nhưng đảm bảo có thể thiết lập được bất kỳ tỷ lệ nào mình muốn mà không cần thủ công "add scale to scalelist". Tất nhiên nó chỉ phục vụ cho những ai sử dụng annotation scale, cad cũ thì nghỉ khỏe.


  7. Bạn đọc lại post 1 của bạn ấy để hiểu chính xác bạn ấy muốn gì.

    - Viewport scale là hệ số tỷ lệ đơn vị vẽ của viewport đó so với model. hệ số này thay đổi ngay khi ta cuộn zoom chuột mà không khóa viewport. (command "zoom" "scale" "HesoTyle layout/model")

    - Nếu chỉnh sửa như trong hình bạn post thì đó là sửa hệ số annotation scale của viewport, bạn nhầm lẫn 2 cái này. (setvar "cannoscale" "scale in ScaleList")


  8. chỉ thay đổi viewport scale ko liên quan gì đến annotations

    Ngược lại, thậm chí còn liên quan chặt chẽ. Nếu bạn biết sử dụng và kết hợp tốt 3 yếu tố: Viewport scale - Object scale - Annotation scale thì bạn sẽ thấy việc sử dụng Annotative object tạo ra hiệu quả sử dụng tuyệt vời đến mức nào.

     

    Cũng chỉ đơn giản là zoom scale viewport như trên thôi, nhưng khi ứng dụng cho Annotative object thì mình fải viết nó phức tạp như thế này:

    ; 06. zoom theo tû lÖ
    (defun C:VZ (/ zxp KC KC1 NAME PT vpObj tyle)
    (if (setq zxp (getreal (TCVN3-Unicode "- NhËp tû lÖ zoom: 1:")))
     (progn
     (if (eq (vla-get-DisplayLocked (setq vpObj (vlax-ename->vla-object (acet-currentviewport-ename)))) :vlax-true) (vla-put-DisplayLocked vpObj :vlax-False))
     (cond ((and (= (getvar "TILEMODE") 0) (> (getvar "CVPORT") 1))
    		(Add-ScaleList (setq tyle (strcat "1:" (rtos zxp 2 0))))(setvar "cannoscale" tyle)
    		(setq zxp (strcat "1/" (rtos zxp 2 0) "xp"))
    		(command "zoom" zxp))
       	((and (= (getvar "TILEMODE") 0) (= (getvar "CVPORT") 1))
    		(setq PT (cadr (grread 't 15)) KC 999999999999999999)
    		(foreach ssn (ss->list(ssget "c" (get-coordinate-screen "BR") (get-coordinate-screen "TL") '((0 . "VIEWPORT"))))
         	(if (> KC (setq KC1 (distance PT (dxf 10 ssn)))) (setq KC KC1 name ssn)))
    		(command "mspace")
    		(if name (setvar "cvport" (dxf 69 name)))
    		(vla-put-DisplayLocked (vlax-ename->vla-object name) :vlax-false)
    		(Add-ScaleList (setq tyle (strcat "1:" (rtos zxp 2 0)))) (setvar "cannoscale" tyle)
    		(setq zxp (strcat "1/" (rtos zxp 2 0) "xp"))
    		(command "zoom" zxp) (princ))
       	(t (Prompt (TCVN3-Unicode "** LÖnh nµy chØ ®­îc sö dông trong Layout **"))))))
     (princ))
    (defun Add-ScaleList ( tyle / dic lst)
    (setq lst '("A0" "A1" "A2" "A3" "A4" "A5" "A6" "A7" "A8" "A9"
    "B0" "B1" "B2" "B3" "B4" "B5" "B6" "B7" "B8" "B9"
    "C0" "C1" "C2" "C3" "C4" "C5" "C6" "C7" "C8" "C9"
    "D0" "D1" "D2" "D3" "D4" "D5" "D6" "D7" "D8" "D9"
    "E0" "E1" "E2" "E3" "E4" "E5" "E6" "E7" "E8" "E9"
    "F0" "F1" "F2" "F3" "F4" "F5" "F6" "F7" "F8" "F9"
    "G0" "G1" "G2" "G3" "G4" "G5" "G6" "G7" "G8" "G9"))
    (if (setq dic (dictsearch(namedobjdict) "ACAD_SCALELIST"))
    (if (not (member Tyle (mapcar'(lambda(x)(cdr(assoc 300 (entget x)))) (dxf-etg-m 350 dic))))
    (entmod (append dic (list (cons 3 (cadr (member (cdadr (reverse dic)) lst)))(cons 350 (entmakex (list '(0 . "SCALE")'(102 . "{ACAD_REACTORS")'(102 . "}")'(100 . "AcDbScale")'(70 . 0)(cons 300 tyle)'(140 . 1.0)(cons 141 (atoi (substr tyle 3 (strlen tyle))))'(290 . 0))))))))))
    


  9. Chủ topic không biết sử dụng annotative object và annotation scale mà Detaling.

    Yêu cầu 1 thì chỉ đơn giản thế này thôi. mình viết qua để dùng tạm, bỏ qua bước kiểm tra điều kiện môi trường áp dụng.

    @chủ topic: hãy đảm bảo khi dùng lệnh này viewport của bạn không bị khóa

    (defun c:vz (/ zxp)
    (if (setq zxp (getreal "- Nhap ty le zoom 1:"))
    (command "zoom" (strcat "1/" (rtos zxp 2 0) "xp")))
    (princ))

    Ví dụ: Nếu muốn zoom viewport tỷ lệ 1:50xp thì bạn gõ lệnh và nhập 50 là ok


  10. code này có chạy được đâu nhỉ. nó lỗi ngay từ khi chọn đối tượng mà.

     

    (setq OBJLINE (vlax-ename->vla-object (car (entsel "\nChon duong thang nguon: "))))

    (while (/= (vla-get-objectname OBJLINE) "AcDbLine")

    (setq OBJLINE (vlax-ename->vla-object (car (entsel "\nChon duong thang nguon: ")))))

     

    (vlax-ename->vla-object nil) => ; error: bad argument type: lentityp nil

     

    Cũng thật khó hiểu cho đoạn code này của Master Worse để select đối tượng :mellow:

     

    Code này có rất nhiều lỗi xử lý reactor, về khía cạnh người dùng thì bạn chỉ nhìn thấy kết quả. nhưng phía sau nó là rất nhiều lỗi sảy ra có thể gây ảnh hưởng đến cad của bạn, và sẽ đặc biệt nghiêm trọng nếu bạn có sử dụng các chương trình khác có sử dụng reactor. vì thế khuyên bạn ko lên dùng code này.

    • Vote tăng 1

  11. 1 - Bạn có sử dụng annotative object và annotation scale khi vẽ không? nếu có thì mình sẽ cho bạn cái của mình. nếu không thì bạn tiếp tục chờ sẽ có người có hứng viết cho bạn. yêu cầu của bạn sao lại "1/50" mà không "50" đi cho gọn? đã mất công thu gọn nó thì làm tới bến luôn đi chứ.

     

    2 - Mình thấy đổi tên lệnh thế cũng chẳng nhanh hơn mà.

    (defun c:cb (command "_copybase") (princ))

     

    3 - Cái này mình không hiểu ý bạn lắm nên thôi không ý kiến.


  12. Bác không sử dụng vì bác đã có thể hài lòng với những gì đã có. còn mình thì không nếu mình có viết 1 cái gì đó làm công việc tương tự hoặc giống hệt như trên.

    Những điều trên mình nói cốt để có thể tạo được thứ tốt hơn nữa, và mình có thể khẳng định 1 điều: làm được :)


  13. Khi mình select 1 viewport clip thì hộp thoại properties hiện rõ ràng thông tin đối tượng là viewport. nhưng khi chọn (car (entget)) thì nó lại trả về ename của polyline dùng để clip viewport đó. Các bác xem có cách nào lấy được thông tin custom scale của 1 viewport bất kể nó có bị clip hay không giúp mình phát.


  14. :lol: Mình đã thấy ngay từ đầu là bài toán này là nếu có làm được thì việc làm đó cũng vô nghĩa bởi đúng như bác TRUNGNGAMY nhận xét: "cách tìm vị trí thì OK nhưng chạy chậm hơn làm bằng tay nhiều" Vậy mà bác cứ ham hố giờ kêu chán.

     

    Bác cứ thử giả thiết nếu công việc của bác gặp phải vấn đề như trên, liệu khi đó bác có nghĩ rằng mình cần viết lisp để làm công việc này hay không? hay tốt hơn là bằng cảm quan, bằng con mắt nghề nghiệp của mình là bác đã tự có thể nhận ra việc liệu có thể đặt được vật thể đó, và nếu đặt được thì đặt ở đâu cho hợp lý nhất. Máy móc không làm thay chúng ta việc này được đâu.

     

    Thêm nữa. khi code chạy quá chậm, thay vì cố gắng đến mệt mỏi để sửa thuật toán thì sao bác không nghĩ rằng có thể thay đổi đề bài để ra kết quả nhanh hơn? Với bài toán này hoàn toàn có thể làm được điều đó bằng cách khoanh vùng và loại bỏ những miền chắc chắn ko thể đặt được vật thể trước khi chạy code. :rolleyes:

     

    @Bác DVH: vài dòng nhận xét mong bác không tự ái.


  15. 5). "Không đè lên cái gì cả". "Cái gì" ở đây theo em hiểu là vị trí các vật thể thuộc địa hình (nhà cửa, cây cối...) chứ không kể đến các đối tượng ghi chú trên bản vẽ như dim, text, leader... thế mới đúng mục đích sử dụng.

    6). "Cái gì" thực tế phải quy định gồm cả phần bên trong của miền kín chứ không chỉ là đối tượng đường. bác không thể đặt vật thể của bác vào trong lòng nhà của người ta được phải không ạ

    Bài này khó quá :D


  16. khi tạo xong block động bạn đừng đóng block editor vội. hãy nhấn nút save block as để lưu nó ra file dxf sẽ được 1 file block. file này nhẹ hơn 1 file bản vẽ (nếu đóng block editor rồi mới lưu thì nó là 1 file bản vẽ thông thường) bởi nó tự động loại bỏ các thông tin khác của bản vẽ không liên quan đến dữ liệu cấu thành file block đó.

    @hochoaivandot: Bạn làm theo thử xem nó còn bay lung tung nữa không. chú ý cả điểm chèn của block

    • Vote tăng 1

  17. có 2 vấn đề đau đầu nhất khi muốn ứng dụng grread:

     

    - 1 là: làm sao để (grread t) luôn tự động thực thi khi đưa vào vòng lặp chứ không cần người dùng tác động vào các thiết bị nhập. có khá nhiều ý tưởng hay ho nếu làm được việc này. hôm trước mót được cái này của ketxu (command "zoom" nil nil). thấy có vẻ chạy ngon trên máy ketxu nhưng rất tiếc bên máy mình không ăn thua. Nếu tải code thừ vlide vào cad thì nó chạy nhưng không thoát được với bất kỳ giá trị trả về nào của grread trừ khi truy cập menu. còn nếu để cad tự động tải khi mở bản vẽ thì không chạy. tsb nó, chả hiểu lỗi gì!

     

    - 2 là: grread không có tùy chọn bắt điểm khi lấy tọa độ con trỏ, dẫn đến việc ứng dụng nó cũng coi như bỏ qua chế độ bắt điểm luôn. điển hình là ở trong ứng dụng bác Hà viết bên trên, không có cách nào để đặt chính xác đường thẳng chia tại 1 điểm mong muốn dẫn đến kết quả chi mang tính chính xác tương đối. Vấn đề này mình đã từng nêu phương án khắc phục và tương đối hiệu quả. các bác có thể tìm hiểu cách làm trong topic viết lại các hàm acet.

     

    Mình viết khá nhiều ứng dụng sử dụng hàm này nên lời khuyên cho các bác nếu muốn dùng nó: hãy kết hợp nó với các hàm grvecs, grdraw, redraw để thay thế việc liên tục fải modified đối tượng như trên. Bản vẽ hơi nặng chút mà dùng cái này vài lần thì chẳng mấy mà hết Ram, tệ hơn có thể treo cad luôn :)

    • Vote tăng 1

  18. Bác Bình thử đổi trục chia của lần chia đầu tiên xem (bác đang để phương đứng, còn em để phương ngang). ra kết quả gần như trùng khít với kết quả khi chạy code của em luôn ^^. Chênh lệch 1 vài cửa sổ ở những vị trí có số đối tượng lớn hơn 500 như bác nêu.

    22980_bacbinhadfa.jpg

    Màu vàng của bác, màu xám của em. (Cái này là em đổi trục chia lần đầu tiên trong code của em cho giống bác)

     

    Em nghĩ là cách chia của bác và của em bản chất thì như nhau. chỉ có cách triển khai code khác nhau thôi. Cách của bác mềm dẻo hơn, dễ can thiệp tỷ lệ chia hơn. của em thì chết cứng với tỷ lệ 1/2 cho mỗi lần chia, đổi tỷ lệ fát là nó lặp đến... treo máy thì thôi :(

     

    Để tăng tốc độ của quá trình thực hiện chia hình thì bác nên sử dụng hàm entdel để xóa và khôi phục đối tượng, hoặc đơn giản hơn là ẩn nó đi bác ạ.

     

    cảm ơn bác về cái này (command "undo" 1) giờ em mới biết :D

    • Vote tăng 1

  19. chế độ bắt điểm bác ạ. thực tế nó vẫn chạy ra kết quả đúng nhưng khi vẽ các khung kết quả này ra em vẽ bằng command nên bị ảnh hưởng bởi chế độ bắt điểm. bác tắt nó đi trước khi chạy là được. Cái khung là đường thẳng và 1 vài khung khác trên hình nếu bác để ý kĩ đã bị sai lệch bởi chế độ bắt điểm của cad.

    Kết quả khi bỏ bắt điểm đây ạ

    22980_chiahinhthaistreetz.jpg

     

    Về chuyện code ngắn khó hiểu thì đúng là chẳng còn cách nào khác cho nó tường minh hơn bác ạ. bài toán này không thể dùng các phép lặp thông thường để chia :(

    • Vote tăng 1

  20. Bác thử code mới này xem, code này sử dụng phương pháp chia khổ giấy. Em có cải tiến thêm 1 chút để loại trừ các miền chọn không tồn tại bất kỳ đối tượng nào.

    Vì cách chia mới này đảm bảo khắc phục được một số điểm yếu của "c" so với "w" nên em quyết định giữ lại "c" chứ không thay bằng "w". Điều này sẽ đảm bảo cho tất cả các cửa sổ chọn chắc chắn sẽ có số đối tượng nhỏ hơn N cho phép

    Tất nhiên bác có thể vẫn để "w" để giảm số cửa sổ chọn xuống nữa. nhưng kết quả em thử trên bản vẽ của bác là không đáng kể (145 của "c" so với 131 của "w")

     

    Bản vẽ của bác có tổng số 42200 đối tượng. như vậy trong điều kiện lý tưởng thì số cửa sổ chọn có thể tạo được với N =500 là 42200/500 = 85 cửa sổ. Con số 145 lớn hơn 1.75 lần so với điều kiện lý tưởng em nghĩ là chấp nhận được.

    (defun select-c (p1 p2 n filter)
    (if (setq ss (ssget "c" p1 p2 filter))
    (if (< (sslength ss) (abs (setq n (* -1 n))))
    (list (list p1 p2))
    (if (< n 0)
    (append (select-c p1 (list (* 0.5 (+ (car p2) (car p1))) (cadr p2)) n filter)
    (select-c p2 (list (* 0.5 (+ (car p2) (car p1))) (cadr p1)) n filter))
    (append (select-c p1 (list (car p2) (* 0.5 (+ (cadr p2) (cadr p1)))) n filter)
    (select-c p2 (list (car p1) (* 0.5 (+ (cadr p2) (cadr p1)))) n filter))))))
    

     

    Test:

    (command "zoom" "e")

    (mapcar '(lambda (x) (command "rectang" (car x) (cadr x))) (select-c (getvar "extmin") (getvar "extmax") 500 '((0 . "LINE"))))

     

    Bác chú ý 1 điều quan trọng khi dùng hàm ssget với lựa chọn "c" hoặc "w": đó là việc bản vẽ được zoom to hay nhỏ ảnh hưởng rất lớn đến kết quả chọn đối tượng của hàm ssget.

    - Bản vẽ được zoom lớn, độ chính xác của hàm ssget tăng lên nhưng nếu đối tượng vượt khỏi biên hiển thị của màn hình quá xa hàm ssget sẽ không chọn được đối tương đó.

    - ngược lại, nếu tập hợp đối tượng bị zoom nhỏ. mật độ đối tượng trên 1 đơn vị diện tích màn hình quá lớn sẽ khiến hàm ssget chạy chậm, độ chính xác giảm và chọn được số đối tượng vược mức thực tế rất nhiều.

    Để khắc phục, bác cần zoom extend tập hợp đối tượng muốn chọn trước khi chạy.


  21. Chỗ này bác hiểu sai này. "Con số 500 đúng là tương đối, nhưng các chọn (ssget "w") làm cho một số đối tượng kg bao giờ đc chọn"

    (ssget "w") chỉ dùng ở bước phân chia cửa sổ chọn. mục đích là để giảm số cửa sổ so với (ssget "c").

    Dù chọn bằng "W" hay "C" thì số cửa sổ thu được vẫn phủ kín miền extmax - extmin

    sau khi có được số cửa sổ chọn rồi, bước kế tiếp áp dụng vào chương trình của bác thì bác vẫn chọn bằng (ssget "c") bình thường. => đảm bảo không mất bất kỳ đối tượng nào. chỉ có điều số lượng đối tượng chọn được có thể lớn hơn 1 chút so với con số tối đa yêu cầu.

     

    mình cũng có thêm ý tưởng là thay đổi trục chia cứ sau 1 lần chia: Ngang - Dọc - Ngang - Dọc ....

    Đây chính là kiểu chia nhỏ cửa sổ theo kiểu phân tờ (A0-A1...) đấy ạ. để mai em thử xem có viết được không :)


  22. mình có theo dõi các lisp benchmark của ketxu. ý mình là muốn dùng chính chương trình benchmark của leemac dùng để đo trong topic kia thôi.

    dòng (vl-remove x lst) sẽ xóa toàn bộ x trong list, điều này sẽ nảy sinh vấn đề trong list xuất hiện >= 2 phần tử sub-list y chang nhau

    Chỗ này có nhầm lẫn không ketxu? thử lấy ví dụ với code của mình, có (vl-remove x lst): (list-group-by-assoc '((1 2) (1 2) (1 2)) -> ((1 2 2 2)) đạt yêu cầu và không bị mất bất kỳ phần tử nào.

     

    Về việc trong list có phần tử đơn thì có thể giải quyết được, nhưng khi xem xét đến tốc độ thì tốt hơn là bỏ qua việc này, trong quá trình sử dụng có thể kiểm tra trước sự có mặt của phần tử đơn nếu nghi ngờ.


  23. Không biết thằng leemac nó test bằng cái gì nhỉ? muốn so thử với nó quá! :D

     

    các bác thử phát triển hàm này lên tổng quát chút nữa đi: nhóm các phần tử của list theo 1 điều kiện người dùng đưa vào. điều kiện có thể là kết quả thỏa mãn 1 hàm lisp hoặc 1 hàm không tên nào đó. kiểu như các hàm điều kiện của vl-remove-if hay vl-sort í.

×