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. - Đó là xét theo phương Y, còn theo phương X thì sao? trong số n dòng đó, mỗi anh 1 kiểu, dài ngắn khác nhau thì bạn tính thế nào?

     

    - Yêu cầu này của bạn nếu thực sự là nếu có ai đó viết dùm thì bạn nên cảm ơn người đó rất nhiều đấy.

    Mình nói thể bởi vì đó chính xác là việc làm cực kỳ vô nghĩa. Bạn sai ngay ở cách thức bạn giải quyết công việc dẫn đến việc bạn đưa ra 1 yêu cầu tối nghĩa và.. vô nghĩa. Và cũng có thể (mình thì cho là như vậy), rằng bạn cũng chưa có cái nhu cầu ngớ ngẩn đó đâu, nhưng vì thử dùng lisp trên bạn thấy nó chưa làm được việc này, việc kia.. bạn đưa ra yêu cầu cốt để chỉ tăng thêm tính năng cho nó, nhưng bản thân bạn thì cũng chưa chắc là mình có sử dụng nó hay không.

    Mình có thể viết lisp phụ vụ công việc, nhưng nếu mình có nhu cầu trên thì mình dùng lệnh Move là OK rồi. (có thể mình nói hơi khó nghe, mong bạn không giận)


  2. Lisp này của bạn Thaistreetz viết nhưng chỉ dùng được cho Dtext nhờ các bạn chỉnh sửa để dùng cho Mtext. Thanks Hình ảnh: ebf210b1fd0540ab9811a536b9941148_36262497.123.png

    Những trường hợp lập bảng như thế này thì tốt hơn là dùng DTEXT cho nhẹ. Quan điểm của mình khi vẽ là hạn chế dùng MTEXT nên không viết cho MTEXT.

    Mình bận nên chỉ sửa qua 1 chút theo yêu cầu của bạn (Căn TEXT hoặc MTEXT vào chính giữa ô) thôi nhá.

    Không căn được MTEXT cho lựa chọn căn vào lề phải và trái của ô đâu đấy, bác nào rảnh rỗi thì sửa dùm bạn ấy cho 2 lựa chọn này. mình cảm ơn!

    (defun C:TC (/ Txt PTxt PTX SS i prmt DK TEMP_JTF DCL_ID DCL_JTF)
    (setq SS (ssget "I" '((0 . "*TEXT"))) i 0)
    (command "undo" "begin")
    (setvar "cmdecho" 0)
    (if (not JTF-T) (setq JTF-T (list 0 1 0)))
    (if (= (cadr JTF-T) 1)
    (setq prmt "Text to Center")
    (if (= (caddr JTF-T) 1) (setq prmt "Text to Right") (setq prmt "Text to Left"))
    );if
    (vl-load-com)
    (if (not SS)
    (progn
    (prompt (strcat "\nSelect text object [setting - " prmt " ]"))
    (setq DK (grread nil 4 2))
    (if (= (car DK) 3)
    (setq SS (ssget "C" (cadr DK) (getcorner (cadr DK)) '((0 . "*TEXT"))))
    (if (= (cadr DK) 115)
    (progn
    (setq DCL_JTF (list "JTFtext : dialog {label = \"Justify in Region\"; : boxed_radio_row {"
    " : radio_button { label = \"Left\"; key = \"Lft\";}"
    " : spacer { width = 1.2; }"
    " : radio_button { label = \"Center\"; key = \"Ctr\";}"
    " : radio_button { label = \"Right\"; key = \"Rgt\";}}"
    " ok_cancel;}"))
    (setq TEMP_JTF (vl-filename-mktemp "CTK.DCL")
    FILE_DCL (open TEMP_JTF "W"))
    (foreach LL DCL_JTF (write-line LL FILE_DCL))
    (close FILE_DCL)
    (setq DCL_ID (load_dialog TEMP_JTF))
    (new_dialog "JTFtext" DCL_ID)
    (set_tile "Lft" (rtos (nth 0 JTF-T) 2 0))
    (set_tile "Ctr" (rtos (nth 1 JTF-T) 2 0))
    (set_tile "Rgt" (rtos (nth 2 JTF-T) 2 0))
    (action_tile "accept" "(setq JTF-T (list(atof(get_tile \"Lft\"))(atof (get_tile \"Ctr\"))(atof (get_tile \"Rgt\"))))(done_dialog)")
    (start_dialog)
    (unload_dialog DCL_ID)
    (vl-file-delete TEMP_JTF)
    (setq SS (ssget '((0 . "TEXT"))))
    );progn
    (if (= (cadr DK) 32) (exit) (progn (prompt "\nWrong Key (!) Select text oject or press [s]etting") (C:TC)))
    ))));if
    (if SS
    (progn
    (command "UCS" "W")
    (setq OSMLAST (getvar "osmode"))
    (setvar "OSMODE" 0)
    (cond ((= (nth 1 JTF-T) 1)
    (repeat (sslength SS)
    (setq txt (ssname SS i) PTxt (GET_MIDTEXT txt) PTX (GET_CENTER_REGION PTxt) i (1+ i))
    (if PTX (vl-cmdf "move" txt "" PTxt PTX))));list_Ctr
    ((= (nth 0 JTF-T) 0)
    (repeat (sslength SS)
    (setq txt (ssname SS i) PTxt (GET_RIGHTTEXT txt) PTX (cadr (GET_LR_REGION PTxt)) i (1+ i))
    (if PTX (vl-cmdf "move" txt "" PTxt PTX))));list_rgt
    ((= (nth 2 JTF-T) 0)
    (repeat (sslength SS)
    (setq txt (ssname SS i) PTxt (GET_LEFTTEXT txt) PTX (car (GET_LR_REGION PTxt)) i (1+ i))
    (if PTX (vl-cmdf "move" txt "" PTxt PTX))));list_lft
    );cond
    (setvar "osmode" OSMLAST)
    (command "UCS" "P")));if
    (prompt "Thaistreetz@gmail.com")
    (command "undo" "end")
    (princ)
    );end TC
    (defun GET_CENTER_REGION (PT / SSL PTC enx)
    (setq SSL (entlast) enx SSL)
    (if (= (DXF 0 SSL) "POLYLINE")
    (while (/= "SEQEND" (DXF 0 (entnext SSL))) (setq SSL (entnext SSL))));if
    (vl-cmdf "-boundary" PT "")
    (if (entnext SSL)
    (progn
    (command "region" "L" "")
    (setq PTC (vlax-safearray->list (vlax-variant-value (vlax-get-property (vlax-ename->vla-object (entlast)) 'Centroid))))));if
    (while (setq enx (entnext enx)) (entdel enx))
    ptc);END
    (defun GET_LR_REGION (PT / SSL PTC )
    (setq SSL (entlast))
    (if (= (DXF 0 SSL) "POLYLINE")
    (while (/= "SEQEND" (DXF 0 (entnext SSL)))(setq SSL (entnext SSL))));if
    (vl-cmdf "-boundary" PT "")
    (if (entnext SSL)
    (progn
    (command "region" "L" "")
    (setq PTC (ACET-GEOM-SS-EXTENTS-FAST (ssget "L")))
    (entdel (entlast))
    (list (list (car (car PTC)) (+ (cadr (car PTC)) (* 0.5 (abs (- (cadr (car PTC)) (cadr (cadr PTC)))))))
    (list (car (cadr PTC)) (- (cadr (cadr PTC)) (* 0.5 (abs (- (cadr (car PTC)) (cadr (cadr PTC)))))))));progn
    nil));END
    (defun GET_MIDTEXT (EN / TB PTxt PT0 PTA)
    (setq TB (ACET-GEOM-TEXTBOX (entget EN) 0))
    (GET_M2P (car TB) (caddr TB)))
    (defun GET_RIGHTTEXT (EN / TB PTxt PT0 PTA)
    (setq TB (textbox (entget EN))
    PTxt (GET_M2P (car TB) (cadr TB))
    PT0 (DXF 10 EN)
    PTA (list (+ (car PT0) (car PTxt)) (+ (cadr PT0) (cadr PTxt))))
    (list(+(car PT0)(car (cadr TB))(abs(-(cadr(car TB))(cadr (cadr TB))))) (cadr(polar PT0 (+(DXF 50 EN)(angle PT0 PTA))(distance PT0 PTA)))))
    (defun GET_LEFTTEXT (EN / TB PTxt PT0 PTA)
    (setq TB (textbox (entget EN))
    PTxt (GET_M2P (car TB) (cadr TB))
    PT0 (DXF 10 EN)
    PTA (list (+ (car PT0) (car PTxt)) (+ (cadr PT0) (cadr PTxt))))
    (list (- (car PT0) (abs (- (cadr (car TB)) (cadr (cadr TB))))) (cadr (polar PT0 (+ (DXF 50 EN) (angle PT0 PTA)) (distance PT0 PTA)))))
    (defun DXF (Id Obj) (cdr (assoc Id (entget Obj))))
    (defun GET_M2P (PT1 PT2) (polar PT1 (angle PT1 PT2) (* 0.5 (distance PT1 PT2))));end
    [/codeBOX]

    • Vote tăng 1

  3. Xây dựng hàm con có chức năng Tách List

     

    Tách 1 List mẹ thành các List con, trong đó count là số lượng phần tử của các List con (tách từ List mẹ).

    Số lượng phần tử trong các List con phải bằng nhau.

    Nếu Số lượng phần tử trong các List con không bằng nhau thì trả về nil

    (Tue-list-tach '(1 5 4 6 3 5) 5)--> nil

    Xét về hiệu năng khi sử dụng thì hàm trả về kết quả như trên là không hợp lý lắm

    Nên để trả về các danh sách con có số phần tử nhập vào, phần dư còn lại bao nhiêu thì cũng đưa vào 1 danh sách con khác

    (Tue-list-tach '(1 5 4 6 3 5) 5)--> ((1 5 4 6 3) (5))


  4. ACET-GEOM-VIEW-POINTS: không đối số, trả về tọa độ góc trái bên dưới và tọa độ góc phải bên trên của màn hình, của vport (nếu đang trong vport) hoặc của viewport (nếu đang trong viewport)

    (defun Cv:View-points (/ Y1 X1)
    (list (polar(polar(getvar "viewctr")(* -0.5 pi)(setq Y1 (* 0.5 (getvar"viewsize")))) pi (/(* Y1 (car(setq X1 (getvar"screensize"))))(cadr X1)))
    (polar(polar(getvar "viewctr")(* 0.5 pi) (setq Y1 (* 0.5 (getvar"viewsize")))) 0 (/(* Y1 (car(setq X1 (getvar"screensize"))))(cadr X1)))))

    • Vote tăng 1

  5. Theo hiểu biết của em thì cấu trúc của Safearray có 3 thành phần:

    1) kiểu <type>: có 8 kiểu (bác đọc thêm trong help developer, hàm vlax-safearray-type)

    2) Kích thước <number of dimensions>: số đối tượng mà Safearray mô tả

    3) Giá trị <value>: là các giá trị của các đối tượng mà Safearray mô tả

     

    Với Safearray mô tả tọa độ điểm 3D thì cấu trúc của nó như sau:

    <type> Double

    <number of dimensions> là số nguyên - số điểm 3D mà Safearray mô tả

    <value> là tọa độ các điểm, ví dụ nếu Safearray mô tả 2 điểm 3D thì <value> sẽ có dạng (x1 y1 z1 x2 y2 z2)

     

    Trong trường hợp của em thì:

    <number of dimensions> là 1

    <value> là nil

    kết quả (vlax-safearray->list #Safearray) trả về lỗi

     

    Edit: đã tìm ra cách khống chế lỗi.

    Với Safearray có <value> là nil thì hàm (vlax-safearray-get-u-bound #Safearray 1) trả về kết quả -1, khác nil trả về kết quả > 0

    • Vote tăng 2

  6. error: Automation Error. Invalid input.

    Chính xác thì nó lỗi tại dòng lệnh thiết lập "what to plot": (vla-Put-PlotType *active-layout* acWindow). Các hàm thiết lập khác không gặp vấn đề gì.

    Chương trình của mình cũng dính lỗi này, nhiều người khác cũng dính lỗi này. nó là lỗi do bản vẽ đang thiếu 1 loại thông tin gì đó chứ không fải do phần cứng máy hay do hệ điều hành hay do cad hay do các hàm thư viện ngoài. Những chương trình in ân sử dụng các hàm vla không sớm thì muộn, không máy này thì máy khác rồi cũng sẽ dính lỗi này hết ráo.

     

    Với người dùng, nếu tiếp tục gặp fải lỗi này thì các bạn cũng đừng vội từ bỏ chương trình của mình. chỉ cần thiết lập "what to plot" (lệnh plot hoặc Ctrl+p) thủ công 1 lần là ok, thông tin bị thiếu sẽ được load vào bản vẽ và chương trình của bạn sẽ sử dụng được bình thường.

    Với programer, Tạm thời mình chưa tìm được thông tin nào khắc phục triệt để lỗi này, chữa cháy tạm bằng command vậy.


  7. Và (ACET-LIST-INSERT-NTH val list nth) : Thêm phần tử val vào vị trí thứ nth của list.

    Hàm cơ bản:

    (defun Cv:list-insert-nth (val lst id)
    (if (<= id 0) (cons val lst) (if lst (cons (car lst) (Cv:list-insert-nth val (cdr lst) (1- id))))))

    Hàm nâng cao:

    (defun Cv:list-insert-nth (val lst lst-id)
    (if (= (type lst-id) 'LIST)
    (if (<= (car lst-id) 0)
    (if (and (cdr lst-id) (= (type(car lst))'LIST)) (cons (Cv:list-insert-nth val (car lst) (cdr lst-id)) (cdr lst)) (cons val lst))
    (if lst (cons (car lst) (Cv:list-insert-nth val (cdr lst) (Cv:list-put-nth (1- (car lst-id)) lst-id 0)))))
    (if (<= lst-id 0) (cons val lst) (if lst (cons (car lst) (Cv:list-insert-nth val (cdr lst) (1- lst-id)))))))

    • Vote tăng 1

  8. Tiếp theo là (ACET-LIST-REMOVE-NTH nth list) : Dùng để loại bỏ phần tử thứ nth ra khỏi list

    Tương tự như trên, hàm này mình cũng post 2 hàm.

    Hàm cơ bản dùng cho list chỉ có 1 lớp

    (defun Cv:list-remove-nth (id lst)
    (if (<= id 0) (cdr lst) (if lst (cons (car lst) (Cv:list-remove-nth (1- id) (cdr lst))))))

    VD1: (Cv:list-remove-nth 1 '(1 2 3)) => (1 3)

     

    Hàm mạnh hơn, dùng cho list nhiều lớp

    (defun Cv:list-remove-nth (lst-id lst)
    (if (= (type lst-id) 'LIST)
    (if (<= (car lst-id) 0)(if (and(cdr lst-id)(= (type(car lst))'LIST)) (cons(Cv:list-remove-nth(cdr lst-id)(car lst))(cdr lst))(cdr lst))
    (if lst (cons (car lst) (Cv:list-remove-nth (Cv:list-put-nth (1- (car lst-id)) lst-id 0) (cdr lst)))))
    (if (<= lst-id 0) (cdr lst) (if lst (cons (car lst) (Cv:list-remove-nth (1- lst-id) (cdr lst)))))))  

    VD2:(Cv:list-remove-nth '(1 2 0) '(1 '(a b (x y)) 3)) => (1 '(a b (y)) 3)

    VD3:(Cv:list-remove-nth 1 '(1 '(a b (x y)) 3)) => (1 3)

    • Vote tăng 1

  9. Ẹc! giống nhau i chang, khác mỗi cái kiểm trả điều kiện đối số. Xét về sự giống nhau của kết quả thì của mình trả về giống acet hơn. tuy nhiên mấy trường hợp đặc biệt này chắc chả mấy khi đụng fải nên dùng thế nào cũng được, tùy nhu cầu sử dụng của mỗi người thôi.

    Vẫn là ACET-LIST-PUT-NTH nhưng mạnh hơn nữa đây:

    (defun Cv:list-put-nth (val lst lst-id)
    (if (= (type lst-id) 'LIST)
    (if (<= (car lst-id) 0)
    (if (and (cdr lst-id)(=(type(car lst))'LIST))(cons (Cv:list-put-nth val (car lst) (cdr lst-id)) (cdr lst))(cons val (cdr lst)))
    (if lst (cons (car lst) (Cv:list-put-nth val (cdr lst) (Cv:list-put-nth (1- (car lst-id)) lst-id 0)))))
    (if (<= lst-id 0)(cons val (cdr lst)) (if lst (cons (car lst) (Cv:list-put-nth val (cdr lst) (1- lst-id) ))))))

    Hàm này mình nâng cấp thêm chút nữa để có thể thay thế 1 phần tử thuộc 1 list nằm trong list...n lớp. với đối số lst-id có thể là list hoặc integer miêu tả địa chỉ của phần tử cần thay thế.

    VD1: (Cv:list-put-nth 1 '(a b c d e) 1) => (a 1 c d e)

    VD2: (Cv:list-put-nth 1 '(a '(1 2 3 '(x y z)) c d e) '(1 3 1)) => (a '(1 2 3 '(x 1 z)) c d e)

    VD3: (Cv:list-put-nth 1 '(a '(1 2 3 '(x y z)) c d e) '(1 3)) => (a '(1 2 3 1) c d e)

    • Vote tăng 2

  10. Tiếp tục mấy hàm sử lý list nhé. mình cũng hay fải sử dụng mấy hàm này.

    (ACET-LIST-PUT-NTH val list nth) : dùng để thay thế 1 phần tử val cho phần tử thứ nth của list.

    Cái này mình cũng chơi đệ quy luôn

    (defun Cv:list-put-nth (val lst id)
    (if (<= id 0)
    (cons val (cdr lst))
    (if lst (cons (car lst) (Cv:list-put-nth val (cdr lst) (1- id))))))

    • Vote tăng 1

  11.  

    hôhô! admin mà cũng đi làm mấy trò crack rẽ tiền của những phần mềm Việt Nam hở. Sao ko tự viết rồi hãy public cho mọi người dùng nhỉ.

    Crack mấy cái này còn dễ hơn ăn cháo nhưng nên tôn trọng tác giả xí. ^_^

    Đêt! Tao ghét mấy thằng đạo đức giả thế này. Phê phán người khác mà còn fải làm "Anh hùng Núp" nữa kìa!? Bản thân có khi đang sở hữu đến 99% sản phẩm crack trong máy mà cứ ba hoa bốc fét ủng hộ này nọ.

    Hãy coi crack là 1 cuộc chơi giữa tác giả phần mềm và cracker đi, nếu thằng cracker thắng thì cũng có nghĩa là nó xứng đáng được nhận thành quả đó. Viết fần mềm rồi đem rao bán thì hãy cứ chuẩn bị tư tưởng bị crack, nếu ngon thì hãy viết sao để người khác không crack được.


  12. Vla cung cấp cho chúng ta hàm Vla-DisplayPlotPreview:

    (vla-DisplayPlotPreview (vla-get-plot (vla-get-activedocument (vlax-get-acad-object))) acFullPreview)

    nhưng mình chẳng thể làm gì với nó, menu chính và menu chuột fải của nó không có nút Plot (dù đã thiết lập đầy đủ tất cả các thông số in), mà nhấn Esc, Space, Enter hay kích nút Exit kiểu gì nó cũng chỉ trả về 1 kết quả duy nhất là nil.

    Các bác có cao kiến gì để em nó dùng như bình thường được không? hiện tại mình đang chữa cháy bằng hàm command nhưng thấy chạy nặng nề quá. :(


  13. Ai biết xin chỉ giùm: làm sao để lấy giá trị của tất cả các biến hệ thống của 1 bản vẽ?

     

    (command "setvar" "?" "") rồi cứ thế mà enter

    Ngoài các biến được cad liệt kê còn có 1 số biến đặc biệt không được công bố do viêc thay đổi giá trị của chúng không được khuyến khích (có 1 topic của bác Hoành nêu cụ thể các biến này) Nếu bạn không có nhu cầu gì quá đặc biệt thì cũng không cần quan tâm đến chúng.

    • Vote tăng 1

  14. Ví dụ sử dụng :

    (defun C:mine2 (/ K L)
     (setq K 0 L 10000)
     (while (< k 10000)
    (CV:Ui-Progress K L "Vui l\U+00F2ng ch\U+1EDD trong l\U+00FAc CAD \U+0111ang c\U+00E0y ^^" "CAD c\U+00E0y xong r\U+1ED3i, gi\U+1EDD \U+0111\U+1EBFn b\U+1EA1n c\U+00E0y ^^")
    (setq k (1+ k) )
     )
     (princ)
    )
    

    - Khi sử dụng hàm này, chương trình chạy xong sẽ có thông báo công việc đã hoàn thành, tỉ dụ như: "cad cày xong rồi, giờ đến lượt bạn cày"

    OK, giờ muốn chương trình tự động tắt dòng thông báo trên, trả lại đất cho status bar khi bạn tiếp tục cày ta thêm code này ngay trước khi kết thúc chương trình - đặt trước hàm (princ):

    ....

    (grread 1)(grread 1)(setvar "modemacro" ".")

    (princ)); end

     

    - Ketxu thử post cái hình nó chạy bên máy của bạn mình dòm thử fát. một số ký tự trong list như "\U+258B" "\U+258A" "\U+2589".. mình cũng không thể tìm thấy trong bảng mã unicode, bên máy mình đoạn này không thấy có tác dụng gì nên chưa rõ chức năng của nó.

    (setq tmp1 (strcat tmp1 (nth (rem (fix (/ var (/ (/ Total 15.0) 8.0))) 8) (list "\U+258F" "\U+258E" "\U+258D" "\U+258C" "\U+258B" "\U+258A" "\U+2589" "\U+2588" ))))

    • Vote tăng 1

  15. Dùng hộp thoại đơn giản hơn nhìu bác ạ ^^ Lúc nào rảnh e thử viết cái. Dùng vector đã thử thấy không ổn định ở các máy khác nhau ạ ^^

    Không ổn định ở vấn đề gì nhỉ? mình viết rất nhiều lệnh có sử dụng vector để hiển thị thông tin mà chương trình tương tác với người dùng. thấy chạy hiển thị tốt trên máy của mình và máy của người khác, với nhiều kích thước màn hình và độ phân giải khác nhau. về bản chất thì cách thức hiển thị của vector vẽ trên màn hình cad và trên hộp thoại là giống nhau mà Ket. chúng đều có đơn vị tính tròn là pixel.


  16. một họ hàm khá hay nữa là acet-ui-progress. mấy hàm này rất hữu ích khi chương trình fải xử lý 1 lượng công việc lớn. mình đang cần nhưng bận nên chưa viết lại được, tạm thời vẫn fải dùng acet. bác nào rảnh thì viết bổ sung em nó vào thư viện này đi.

    À quên: ý tưởng của mình là sử dụng vector để vẽ pogress bar trực tiếp lên màn hình cad hoặc hộp thoại chứ không dùng thanh status bar của cad nữa (muốn dùng cũng chả làm được). bác nào khéo tay chút có khi còn làm được cái pogress bar đẹp hơn ấy chứ :D


  17. Đang bận nên mình cuốc tạm ý tưởng thực hiện của ketxu để các bác hoàn thiện:

    (defun ss-drag-move (ss pt / i sscp el box ang kc p ssl)
    (setq el (entlast) i -1 ssl (sslength ss) sscp (ssadd))
    (while (< (setq i (1+ i)) ssl) (vla-copy (vlax-ename->vla-object (ssname ss i))))
    (while (setq el (entnext el)) (setq sscp (ssadd el sscp)))
    (setq box (Cv:geom-ss-extents-fast sscp))
    (command "move" sscp "" pt pause)
    (setq p (cadr (grread t)) ang (angle pt p) kc (distance pt p))
    (if (equal (Cv:geom-ss-extents-fast sscp) (mapcar '(lambda (x) (polar x ang kc)) box) 0.00001)
    (progn (command "erase" sscp "") p)
    (command "erase" sscp ""))) 

    • Vote tăng 1
×