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

ngokiet

Thành viên
  • Số lượng nội dung

    404
  • Đã tham gia

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

  • Ngày trúng

    43

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


  1. 1 giờ trước, cuongtk2 đã nói:

    Autocad.Net

    Cho mình hỏi làm sao để ngăn lỗi khi tham số đầu vào ResultBuffer không có gì 

    VD:

    (list_so 8)    ra   (1 2 3 4 5 6 7 8)

    (list_so)     báo lỗi ADS, thoát Cad

    Mình chưa test nhưng cơ bản là như vậy.

    Kiểm tra thamso is nothing.

    Hay thamso.AsArray().Length thử xem trươc khi đọc biến.

    Cũng có thể dùng hàm try catch.

     

    Mình mới test. Bác thừ dủng hàm này để xem thông số cad đưa vào như thế nào

    <LispFunction("test2")> Public Function test2(ss As ResultBuffer) As Object
            If ss Is Nothing Then
                MsgBox("Không có tham số")
            Else
                MsgBox(ss.ToString)
            End If

     


  2. 1 giờ} trướ}c, Tue_NV đã nói:

     

    Không thừa đâu bạn.

    Vì điều kiện mình đang kiểm tra (/= (length b) 0) . Nếu không remove thì (length b) nó khác 0 hoài thôi 

    Ý mình như thế này là được

    (defun test(ss / x y kq)
      (setq ss (vl-sort ss '(lambda(a b) (> (car a) (car b))))
    	x  (caar ss)
    	y  (cdar ss))
      (foreach z (cdr ss)
        (if (eq (car z) x)
          (setq y (mapcar '(lambda(a b) (mapcar '+ a b)) y (cdr z)))
          (setq kq (cons (cons x y) kq)
    	    x  (car z)
    	    y  (cdr z))))
      (cons (cons x y) kq))

    Hay trong hàm của bác ở chỗ (setq b (vl-sort ....)) Thì (setq b a) nó vẫn chạy đúng.

    • Vote tăng 1

  3. 39 phút trước, Tue_NV đã nói:

    Chào Dương Nhat Duy!

    Bạn thử code sau: 

     

    
    
    (defun c:test (/ a b c ptdau lst)
    (setq a 
    (list
     (list "A" (list 1 1) (list 2 2) (list 3 3))
     (list "B" (list 1 2) (list 3 4) (list 5 6))
     (list "C" (list 0 0) (list 0 0) (list 0 0))
     (list "A" (list 1 1) (list 1 1) (list 1 1))
     (list "B" (list 10 10) (list 10 10) (list 10 10))
    ))
    (setq b (vl-sort a '(lambda(x y) (< (car x) (car y)))) lst '())
    (while (/= (length b) 0)
      (setq c (vl-remove-if '(lambda(x) (/= (car x) (caar b))) b))
      (setq ptdau (car c))
      (if (cdr c)
        (foreach x (cdr c)
         (setq lst (append lst (list (list (car ptdau) (mapcar '(lambda(q z) (mapcar '+ q z)) (cdr ptdau) (cdr x))))))
        )
        (setq lst (append lst (list ptdau)))
      )
      (setq b (vl-remove-if '(lambda(x) (= (car x) (caar b))) b))
    )
               lst)
    
    

     

    Hình như bác thừa bước sort. Nếu sort thì duyệt qua 1 lận là xong đâu cần vl-remove.


  4. 6 giờ trước, Duong Nhat Duy đã nói:

    Lâu ko đụng đến lisp nên h quên hết r, các bạn cho mình hỏi, mình có 1 list input như bên dưới, làm sao để có output như mình mong muốn:

    INPUT:

    • cadvietlisp.lsp
      lisp help
    •  
    
    (list
     (list "A" (list 1 1) (list 2 2) (list 3 3))
     (list "B" (list 1 2) (list 3 4) (list 5 6))
     (list "C" (list 0 0) (list 0 0) (list 0 0))
     (list "A" (list 1 1) (list 1 1) (list 1 1))
     (list "B" (list 10 10) (list 10 10) (list 10 10))
    )

    OUTPUT:

    • cadvietlisp.lsp
      lisp help
    •  
    
    (list
     (list "A" (list 2 2) (list 3 3) (list 4 4))
     (list "B" (list 11 12) (list 13 14) (list 15 16))
     (list "C" (list 0 0) (list 0 0) (list 0 0))
    )

    Mình xin cảm ơn !

    Mình cùng mới viết thử.

    Bạn test hàm sau

    (defun test(ss / x kq)
      (while ss
        (setq x (car ss)
    	  ss (vl-remove-if '(lambda(a)
    			      (if (eq (car a) (car x))
    				(setq x (cons (car x) (mapcar '(lambda(b c) (mapcar '+ b c)) (cdr x) (cdr a)))))) (cdr ss))
    	  kq (cons x kq)))
      (reverse kq))

     

    • Vote tăng 1

  5. 17 phút trước, kidxxx đã nói:

    Bác cho em hỏi xíu: Hàm: assoc 300 thì số 330 đây có nghĩa là gì ạ?

    Theo em được biết thì hàm assoc có công thức (assoc item alist) trong đó item trả về phần tử tương ứng với vị trí của nó trong list. Vậy 330 của bác chính là item phải ko ạ? Nếu vậy thì list của bác có hơn 330 phần tử lun ạ? Cái này em chưa hiểu lắm nên nhờ bác giải thích thêm.

     

    Như ví dụ của em: (setq alist ‘((1 “ONE”) (2 “TWO”) (3 “THREE”)))
    (assoc 1 alist) --->(1 “ONE”)
    (assoc 2 alist) --->(2 “TWO”)

    assoc 300 thì lấy phần tử có số đầu 300. còn lấy phần tử thứ 300 là dùng nth.

    Vi dụ

    (setq alist ‘((299 “ONE”) (300 “TWO”) (301 “THREE”)))
    (assoc 299 alist) --->(299 “ONE”)
    (nth 1 alist) --->(300 “TWO”)


  6. 47 phút trước, Doan Nguyen Van đã nói:

    Em trước giờ chỉ lập trình Lisp. 

    Thấy ứng dụng này có vẻ hay quá,.. 

    Mới bắt đầu bác cho em hỏi chút: 

    - Để lập trình VB.Net thì dùng ứng dụng nào (theo e tìm hiểu thì có thể dùng: Visual Studio, MS C#) 

    - Khi lập trình xong, làm sao để load cùng với file vd.lsp chính mỗi khi khởi động cad

    - Có thể đóng gói lại để cho gọn (giống .VLX, .fas ..) không ạ 

    Chân thành cảm ơn bác! (Em có search diễn đàn mà thông tin không nhiều, các thông tin thì chủ yếu về các hàm) 

    - Lập trình .NET thì dùng Visual Studio. Nó có cả Visual Basic và C++ trong đó luôn.

    - Muốn load cùng file lisp thì lisp cú sử dụng netload thôi. Còn load khi khởi động thì bác load lisp nó theo lisp. Hay tham khảo thêm https://knowledge.autodesk.com/support/autocad/learn-explore/caas/sfdcarticles/sfdcarticles/How-to-autoload-DLLs-with-AutoCAD.html

    - Nó luôn đóng gói xong mới sủ dụng được. Đây là ngôn ngữ cần bien dịch chứ không chạy trực tiếp. Nó dịch ra file dll cho autocad.

     

    Mình cũng biết ít thôi. Nó là ngôn ngữ lập trình chung. Có thể tạo ứng dụng riêng rất mạnh. Không có ai biết hết nó dâu. Mình chỉ tìm hiểu cơ bản và mình muốn làm gì thôi. Dọc help là chính.

    • Vote tăng 1

  7. 3 giờ trước, Doan Nguyen Van đã nói:

    Đau đầu thật bác ạ, cháu vừa thử 1 đống ACet-file ... mà vẫn không được, chẳng lẽ đành bó tay thật 

    Vấn đề nữa là đọc rồi cũng không làm gì được. Vì các lệnh liên quan tới file đều không hỗ trợ path unicode. Nếu muốn chỉ có thể viết bằng .net thôi.


  8. 23 giờ trước, Doan Van Ha đã nói:

    Tôi muốn hỏi về COLOR.

    Giả dụ tôi lấy được màu màn hình, có chỉ số là n (hoặc 3 màu RGB). Tôi muốn tìm 1 màu gần giống màu này thì có nguyên tắc tìm không?

    Lý do: tôi muốn tạo các đối tượng có màu gần giống màu màn hình để nhìn nó chỉ lờ mờ (do không biết trước màu màn hình mà user đang dùng).

    VD: khi màu màn hình là Black thì màu 250 là gần giống.

    Ai biết xin chỉ giùm, cám ơn.   

    Hình như ý bác là muốn làm mờ đối tương. Chăc dung để review grread. 

    Mình nghĩ là nên thay dổi thuộc tình transparent thì dễ cho bạn hơn là thay đổi màu. Mình thường sài cách này.


  9. 3 phút trước, meohoang88 đã nói:

    :D :D

    Bác nói câu cuối em cũng vỡ lẽ ra: Câu hỏi cuối cùng chỉ đơn giản là: Có cách nào để khi sử dụng DIMLFAC thì giá trị dim kích thước không tự động bị trả về 1-1?

    Cảm ơn bác đã góp ý. Trong lúc chờ đợi cao thủ, em cũng nghe lời bác chỉnh tay vậy, .... , đang quét, đang quét... 

     

    Cad không có tự động đâu bác. Do lỗi gì nên nó fix về dímtyle (mình nghĩ do update hay matchprop thôi) .

    Cách quản lý hay nhất vẫn là dímtyle thôi. Tuy nhiên bản dim style của cad hơi ngu một chút vì chỉ cho chỉnh từng style 1 nên mất công 1 chút khi so sánh các kiểu dim với nhau.

    Có bác nào rảnh viết 1 lisp chỉnh style dim mà các thông số chỉnh theo bản thì mình nghĩ nhiều người cần hơn.


  10. Trong Cad thì các cad mới sau này có thêm biến Dimlayer. Khi Dim thì nó tự động ghi vào layer được set sẵn bằng biến đó.

    Hồi trước mình sái cad cũ 2016 hay 2019 mình nhớ là nếu dim bằng ribbon thì nó tự động đưa về layer được định sẵn bằng biến trên. Nhưng dùng lệnh nhập thì không đươc.

    Giờ mới thử trên cad 2020 thì cả ribbon hay lệnh nó cũng tự chuyển luôn rồi.

     

    Hình như trên cad của bạn không phải bản 2020 nên nó mới vậy. Bác thử đánh dimlayer có phải là AM-5 không? 

    • Like 1

  11. 4 phút trước, Doan Nguyen Van đã nói:

    Rtos nó sẽ làm tròn lên á bác, dẫn đến có thể sai kết quả ở 1 số trường hợp. VD (khoảng cách 175, khoảng chia 30 => số lượng  = 5.8333 = 6 sai) (điều này có thể thay đổi nếu chủ tus có logic về số lượng gạch theo kiểu khác)

     

    Do mình nghĩ trong trường hợp này để ghi kích thước chẳn nên mới góp ý như vậy. Nếu ko chẳn thì kiểu gì cũng sai.


  12. 3 giờ trước, quan le đã nói:

    Nhân tiện cho mình hỏi, có bạn nào có lisp dim mà text thể hiện được ra được số lượng gạch và kích thước gạch không thế? Ví dụ mình có 1 đoạn dài 6030 (mm), kích thước 1 cạnh của viên gạch là 603, khi dim text hiện ra luôn được là 10x603=6030. Edit text với số lượng lớn thì lâu quá.

    Bác có thể ghi theo kiểu này hay thay đổi cho phù hợp với mình

     


  13. 1 phút trước, Doan Van Ha đã nói:

    Do chỗ tô đen khó hiểu quá!

    Do tăt mở không phải là biến riêng mà nó chỉ là 1 bit trong osmode thôi. Nên chỉ thay đổi bit đó là được. Có thể +/- 16384 là được.

    Nhiều bác viết lisp hay set về 0 nên khi hàm lỗi mà ko viết hàm bẫy lỗi làm mất setting osmode rất khó chịu. Dùng cách này thì ok hơn.


  14. Tính chính xác thì khó vì trong khu đất ko phải lúc nào cũng vận chuyển theo đường thẳng được. Nếu muốn tính chính xác thì phải có biện pháp thi công. có đường dự kiến di chuyển trong khu đất. Cho nên cần kinh nghiệm đanh giá hiện trang như thế nào để đua hệ số thích hợp. Khi vận chuyển trong khu đất rất khó vì có thể đat yếu nên phải chọn hệ số nhân cho nó. Ví dụ như khoảng cách AB và CD phải nhân hệ số 1.2 hay bao nhiêu đó. Cái này do bên thi công đánh giá. Bác nào có kinh nghiệm thi công góp ý. Bác tính chính xác quá thì khó kiếm đơn vị thi công vì có thể họ đánh giá khác.


  15. 1. Về chia lô làm quy hoạch thì nếu ko sài lisp thì bạn có thể dùng aray hay hatch để chia. Nếu khu vuông vức thì đơn giản là làm 1 cái rồi group lại copy thôi.

    2. Chia lô nhà phố thì mệt hơn vì còn quy định về dãy nhà không quá 60/80m phải có khoảng hỏ tối thiểu 4m nên đôi khi cũng phải tự chia thôi. Có thể tạo custom hatch để chia. Vói lại khoảng cách cũng nên chẳn và đều để tiện căm môc và thiết kế mẫu nhà.

    3. Nếu làm nhiều thì nên viết lisp (Hay thuê viết) theo yêu cầu và thói quen của mình để làm vì ở Vn tiêu chuẩn các cty cũng khác nhau nhiều.


  16. Cái geometric center là trọng tâm của đa giác nên khoảng cách trung bình từ nó đến đường biên là bằng bán kính vòng tròn có diện tích bằng diện tích đa giác đó.

    Vì vậy cách tính rất dễ.

    Còn cách tính của bạn thì ra kết quả chẳn biét dùng để làm gì vì nó ko phải là giá trị trung bình vì mật độ đỉnh theo các hướng ko bằng nhau..

×