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

LuytBui

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

    20
  • Đã tham gia

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

  • Ngày trúng

    6

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


  1.  

    Vào lúc 11/12/2020 tại 17:48, TrungOji đã nói:

    Mà nhân tiện đây, như bác lbttkcl gợi ý lệnh Stretch kết hợp với From. Thì sẽ phải mất thêm nhiều thao tác nữa. Giá mà có cao thủ nào đó viết 1 Lisp về stretch. Ý tưởng là Gõ ST-->Pick chọn điểm đầu mút (ví dụ đầu mút là điểm đầu gốc (0,0) của hình chữ nhật)---> Chọn phương stretch (ví dụ phương theo chiều dài) --> Nhập khoảng cách 500. Kết quả thu được là hình chữ nhật có chiều dài 500 ấy. Thế thì tốt quá. Mong các bác giúp đỡ ạ. 

     Bạn thử lisp này xem

    ss stretch.lsp


  2. Mình viết cái lisp này để tiện dùng cá nhân , có thể đáp ứng mặt nào đó nhu cầ của bạn.
    Cách dùng:

    + lệnh `0 `1 `2 `3 .... `9: gán 01 đối tượng vào các slot từ 0 đến 9
    + lệnh 00 11 22 33 .... 99: match prop ngược đến các đối tượng thuộc slot tương ứng.

    Ví dụ nha, bạn chọn đối tượng gốc xong nhập `8 enter. sau đó chọn đối tượng (1 hoặc nhiều) muốn chuyển về giống đối tượng 8 rồi nhập 88 enter.

     

    abcabcabc.lsp

    • Like 1

  3. Em mạo muội đưa ra phương án này các anh xem thế nào ạ:

    +) Xây dựng 2 hàm (defun Boundary_Circle(list_of_points) (...)) (viết tắt BC) và (defun Boundary_Circle_4(list_of_4_points) (...)) (viết tắt BC4)

    (defun BC(alist)      ; trả về 3 điểm thuộc đường tròn bao tất cả các điểm trong alist

        (nếu (length alist = 3) trả về (alist) )

        (nếu (length alist >4) trả về (BC (car alist) (BC (cadr alist)))  )

        (nếu (length alist = 4) trả về (BC4 alist) )

    )

    (defun BC4(alist)    ;alist gồm 4 điểm

         (lặp lại cho đến khi tìm ra

    (***)     nếu  ( (nth i alist) nằm trong đường tròn ngoại tiếp của 3 điểm còn lại của alist) trả về 3 điểm còn lại

         )

    )

    (***):  So sánh khoảng cách đến tâm đường tròn ngoại tiếp. Cách xác định tâm đường tròn ngoại tiếp của 3 điểm dựa theo tọa độ có thể tham khảo hàm circumcircle trong http://paulbourke.net/papers/triangulate/tri.lisp

    Em rất hứng thú với bài toán này nhưng chưa triển khai được vì không có thời gian.

     

     

    • Like 1

  4. Đơn giản và trực quan nhất thì bạn dùng 2 cái vòng lặp thôi.

    (setq i 0)
    (repeat n
    		( ... nội dung lặp lại . . .)
    		(setq i (+ i 1))
    )
    ;; sau khi chạy xong vòng lặp trên thì i đã có giá trị là n.
    ;; phần lớn các trường hợp là làm việc với list hoặc selection set (đều là đếm stt phần tử từ 0 trở đi đến n-1)
    ;; do đó cần giảm giá trị của i đi 1
    (setq i (- i 1))		;;; hoặc cũng có thể dùng (setq i (- n 1)) để dễ code dễ hiểu hơn
    (repeat n
    		( ... nội dung lặp lại . . .)
    		(setq i (- i 1))
    )
    ;; sau khi chạy xong vòng lặp trên thì i đã có giá trị là -1

     


  5. Cảm ơn anh đã bỏ tâm huyết và chia sẻ miễn phí!
    Em mới tải về thử thì có lỗi như thế này. Bản vẽ của em khung in là Rectangle (khung trong), khi em chỉnh các thứ rồi nhấn preview thì đối tượng khung bị chuyển sang layer "!MultiPlotBoundary..." là layer mà lisp tạo ra, có thuộc tính là không in. Do đó preview lên thì không thấy khung bản vẽ. Anh giúp em với ạ


  6. Bạn thử xem đúng ý chưa?

    cbp - Chen block vao cac point co san.lsp

     

    (defun c:cbp()
    	(Prompt "\nChon vung chua cac Point")
    	(setq ss (ssget '((0 . "POINT")	) ))
    	(setq blockname (getstring "\nNhap ten block: "))
    	(setq Xscale (getreal "\nNhap ti le Scale phuong X:"))
    	(setq Yscale (getreal "\nNhap ti le Scale phuong Y:"))
    	(setq Rotation (getreal "\nNhap goc xoay:"))
    	(setq i 0)
    	(repeat (sslength ss)
    		(setq po (cdr (assoc 10 (entget (ssname ss i ) ))) )
    		(command "-insert" blockname "_nod" po Xscale Yscale Rotation)
    		(setq i (+ 1 i))
    	);repeat
    ); end Defun

     

    • Like 1

  7. Trình mình chưa đủ để viết ra cái LISP này cho bạn. Nhưng có cách khác không phải dùng lisp như sau:
    + Gõ lệnh "Erase" ---> gõ "wp" ---> chọn các điểm để vẽ thành khung ngoài        

                                       ---> gõ tiếp "r"

                                       ---> gõ tiếp "cp" ---> chọn các điểm để vẽ thành khung trong

    + Enter để kết thúc lệnh

     


  8. Chào các tiền bối, em mới học lisp được 1 tháng, do nhu cầu cá nhân em tự viết 1 lisp cùi bắp như file đính kèm. 
    Công dụng của lisp:
       + Chế độ COPY: là lưu trữ một tập đối tượng và điểm chèn tương ứng và đặt tên 1/2/3/4/5

       + Chế độ PASTE: paste tập đối tượng đã nhập vào điểm chỉ định.

    >>>Lisp này công dụng cũng giống như Insert Block chỉ có điều không tạo thêm block mới.
    Thao tác:
    + COPY:   ccc -> c -> 1 (hoặc 2 3 4 5) -> chọn các đối tượng -> chọn điểm chèn.

    + PASTE: ccc -> p -> 1 (hoặc 2 3 4 5) -> chọn điểm chèn

    * Lisp dùng cảm giác chưa được "sướng" cho lắm vì giới hạn trong các tên 1 2 3 4 5. Xin các bác giúp em sửa lisp về thành thế này:
    Thao tác mong muốn:
    + COPY:   ccc-> c -> nhập tên đối tượng (chuỗi bất kỳ) -> chọn các đối tượng -> chọn điểm chèn. Lưu tên đối tượng mới vào danh sách
    + PASTE:  ccc-> p -> nhập tên đối tượng

     Nếu chuỗi vừa nhập không có tên trong danh sách đã lưu thì thoát lệnh. 

     Nếu chuỗi vừa nhập có trong danh sách thì: -> chọn điểm chèn-> Paste theo tên, điểm chèn.
    Cảm ơn các bác đã quan tâm!!! :D :D :D

    (defun c:ccc()
    (if (= oldmode nil) (setq oldmode "c") )
    (if (= oldslot nil) (setq oldslot 1) )
    (setq mode (getstring (strcat "Che do copy/paste (c/v)?:  <" oldmode ">   :") ) )
    (if (= mode "") (setq mode oldmode) )
    (if (/= mode "c") (setq mode "p") )
    (setq oldmode mode)
    (setq slot (getint (strcat "Nhap ma doi tuong: 1/2/3/4/5 :   <" (rtos oldslot 2 0) ">   :") ) )
    (if (= slot nil) (setq slot oldslot) )
    (setq oldslot slot)
    (cond
    	(( = mode "c")	(cond 
    			(( = slot 1 ) (
    			(prompt "Chon cac doi tuong can copy: ")
    			(setq ss1 (ssget ) )
    			(setq pt1 (getpoint "\nChon diem insert") )	
    			))
    			(( = slot 2 ) (
    			(prompt "Chon cac doi tuong can copy: ")
    			(setq ss2 (ssget ) )
    			(setq pt2 (getpoint "\nChon diem insert") )	
    			))
    			(( = slot 3 ) (
    			(prompt "Chon cac doi tuong can copy: ")
    			(setq ss3 (ssget ) )
    			(setq pt3 (getpoint "\nChon diem insert") )	
    			))
    			(( = slot 4 ) (
    			(prompt "Chon cac doi tuong can copy: ")
    			(setq ss4 (ssget ) )
    			(setq pt4 (getpoint "\nChon diem insert") )	
    			))
    			(( = slot 5 ) (
    			(prompt "Chon cac doi tuong can copy: ")
    			(setq ss5 (ssget ) )
    			(setq pt5 (getpoint "\nChon diem insert") )	
    			))
    			( t nil)
    			))
    	(( = mode "p")	(cond 
    			(( = slot 1 ) 	(command "COPY" ss1 "" pt1))
    			(( = slot 2 ) 	(command "COPY" ss2 "" pt2))
    			(( = slot 3 ) 	(command "COPY" ss3 "" pt3))
    			(( = slot 4 ) 	(command "COPY" ss4 "" pt4))
    			(( = slot 5 ) 	(command "COPY" ss5 "" pt5))
    			))
    	(T (print "T nil") )
    )
    ) ; end func 

     

    ccc.lsp

×