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

Nhờ các bác xem giúp về vòng lặp của lisp.

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

Nhờ các bác kiểm tra giúp em đoạn code sau ạ. 
Mục tiêu của lisp là lấy tọa độ của tâm các hình trong nằm trong các hình chữ nhật theo cum hình chữ nhật. sau đó xuất ra fiel txt.
Nhưng em đang bị vướng phần lấy giá trị thư tự của hình chữ nhật. 
Vòng lặp đang thực hiện bằng cách chạy hết vòng lặp của rect rồi mới chạy đến circle.
Nhờ các bác xem giúp.

Em cảm ơn ạ.

input.png

blm8.lsp

debug.png

  • 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

@tannguyen291 :D vâng bác. em mới học code nên chủ yếu là dùng AI. cái này do em sửa nhiều nên có thể bị thiếu ạ. 
Nhưng vấn đề của em là các vòng lặp đang chạy không theo ý mình.
Như bình thường vòng lặp trong vòng lặp thì nó sẽ duyệt qua 1 giá trị vòng rect, rồi đến vòng lặp circle rồi mới lặp tiếp vòng lặp rect
Nhưng ở đây nó duyệt 1 phát qua hết vòng lặp rect xong mới đến vòng lặp circle

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

blm8.lsp
Nhờ các bác xem giúp em có chỉnh lại nhưng đang bị lỗi, dừng khi lặp hết hình tròn trong hình chữ nhật đầu tiên ạ.
Em cảm ơn.
 

Quote

(defun c:blm8 (/ rectStt rect-coords circle-center cx cy min-x min-y max-x max-y i doc pt rects msp circles prefix size storeCircles allAnchor rectCount circleCount rect circle rectCenter circleCenter allCircles listRC listCircles listCirclesA)

  (setq rects (ssget '((0 . "LWPOLYLINE") (70 . 1))) ; Chọn các hình chữ nhật

        circles (ssget '((0 . "CIRCLE"))) ; Chọn các hình tròn

        prefix (getstring "\nNhập tiền tố cho hình chữ nhật: ")

        size (getreal "\nNhập kích thước chữ: ")

        i 1

        rectCount 1

        circleCount 1

        allCircles '()

        allAnchor '()

        listRC '()

  )

 

  ; Kiểm tra phiên bản AutoCAD

  (if (> (atof (substr (getvar "ACADVER") 1 4)) 16.0)

    (progn

      (vl-load-com)

      (setq doc (vla-get-ActiveDocument (vlax-get-Acad-Object))

            msp (vla-get-modelspace doc))

 

      (if (and rects circles)

        (progn

          ; Tạo listRC gồm các hình chữ nhật và các hình tròn tương ứng

          (while (setq rect (ssname rects 0))

            (setq rectCenter (vlax-curve-getPointAtParam rect (/ (vlax-curve-getEndParam rect) 2)))

            (setq rect-coords (mapcar 'cdr (vl-remove-if-not '(lambda (x) (member (car x) '(10))) (entget rect))))

            (setq min-x (apply 'min (mapcar 'car rect-coords))

                  min-y (apply 'min (mapcar 'cadr rect-coords))

                  max-x (apply 'max (mapcar 'car rect-coords))

                  max-y (apply 'max (mapcar 'cadr rect-coords)))

            (setq listCircles '())

            (while (setq circle (ssname circles 0))

              (setq circle-center (cdr (assoc 10 (entget circle))))

              (setq cx (car circle-center)

                    cy (cadr circle-center))

              ; Kiểm tra nếu hình tròn nằm trong hình chữ nhật

              (if (and (>= cx min-x) (<= cx max-x) (>= cy min-y) (<= cy max-y))

                (setq listCircles (cons circle listCircles)))

              (setq circles (ssdel circle circles))

            )

            (princ (strcat "\nSố lượng hình tròn trong hình chữ nhật " (itoa (length listCircles))))

            (setq listRC (cons (list rect listCircles) listRC))

            (setq rects (ssdel rect rects))

            (princ (strcat "\nSố lượng listRC " (itoa (length listRC))))

          )

 

          ; Lặp qua listRC để xử lý từng hình chữ nhật và các hình tròn tương ứng

          (foreach rc listRC

            (setq rect (car rc))

            (setq listCirclesA (cadr rc))

            (setq rectCenter (vlax-curve-getPointAtParam rect (/ (vlax-curve-getEndParam rect) 2)))

            (entmake (list (cons 0 "TEXT")

                           (cons 10 rectCenter)

                           (cons 40 size)

                           (cons 1 (strcat prefix (itoa rectCount)))

                           (cons 62 1)

                           (cons 7 "STANDARD")))

            (setq rectStt (strcat prefix (itoa rectCount)))

            (princ (strcat "\nSố lượng hình tròn trong hình chữ nhật " rectStt ": " (itoa (length listCirclesA)))) ; Hiển thị số lượng hình tròn

            (foreach circle listCirclesA

              (setq circleCenter (vlax-curve-getPointAtParam circle (/ (vlax-curve-getEndParam circle) 2)))

              (entmake (list (cons 0 "TEXT")

                             (cons 10 (list (+ (car circleCenter) 0.1) (+ (cadr circleCenter) 0.1)))

                             (cons 40 size)

                             (cons 1 (itoa circleCount))

                             (cons 62 8)

                             (cons 7 "STANDARD")))

              (setq allCircles (cons (list rectCenter circleCount (car circleCenter) (cadr circleCenter)) allCircles)) ; Thay rectStt bằng rectCenter

              (princ (strcat "\nDebug allCircles: " (vl-princ-to-string allCircles))) ; Debugging output

              (setq circleCount (1+ circleCount))

            )

            (setq rectCount (1+ rectCount))

          )

 

          ; Sắp xếp danh sách allCircles theo thứ tự tăng dần của circleCount

          (setq storeCircles (vl-sort allCircles (function (lambda (a b) (< (cadr a) (cadr b))))))

 

          ; Thêm danh sách đã sắp xếp vào allAnchor

          (setq allAnchor (append allAnchor storeCircles))

 

          ; Xuất danh sách allCircles ra tệp .txt

          (export_allAnchor_to_txt allAnchor))

        (princ "\nKhông tìm thấy hình chữ nhật hoặc hình tròn.")

      )

    )

    (alert "\nPhiên bản AutoCAD của bạn không hỗ trợ tạo TABLE.")

  )

)

 

; Xuất sang file .txt

(defun export_allAnchor_to_txt(allAnchor)

  ; Chọn thư mục lưu file txt

  (setq file_path (getfiled "Lưu allAnchor vào .txt" "" "txt" 1))

   

  (if file_path

    ; Mở file để xuất

    (progn

      (setq f (open file_path "w"))

      (foreach circle allAnchor

        (princ (strcat "\nDebug: " (vl-princ-to-string circle))) ; Debugging output

        (write-line (strcat (rtos (car circle) 2 3) " " (itoa (cadr circle)) " " (rtos (caddr circle) 2 3) " " (rtos (cadddr circle) 2 3)) f)) ; Thay đổi định dạng xuất

      (close f)

      (princ (strcat "\nDữ liệu đã được xuất thành công vào " file_path)))

    (princ "\nHủy lưu file."))

)

 

  • 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

Mới học thì nên tham khảo nhưng đừng phụ thuộc.

(while rect

    (while circle

        (ssdel circle

    )

    (ssdel rect

)

cái này là cái gì. hiểu thuật toán chứ.???

qua vòng 1: danh sách circle đã bị xóa sạch rồi còn làm gì cho các vòng sau nữa.

phụ thuộc ít thôi.

  • Like 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

Vứt cái chatgpt sang 1 bên. bài này có 3 cách giải. 

1. duyệt qua từng rectange lấy listpoint sử dụng (ssget "CP" listpoint '((0 . "CIRCLE"))) để chọn được các vòng tròn nằm trong nó.

note: câu lệnh đơn giản, chạy với polyline bất kỳ không nhất thiết là hình chữ nhật. nhưng nếu vòng tròn lớn hơn polyline thì không chọn được.

2. sử dụng hàm trong express tool để kiểm tra điểm nằm trong 1 danh sách điểm (acet-geom-point-inside p1 lst dst) {hoặc bất kỳ hàm point inside nào trên mạng}  để loại trừ

not: chạy với polyline bất kỳ không nhất thiết là hình chữ nhật.

3. sử dụng cách của chatgpt tuy nhiên nên dùng 1 vòng lặp for.

note: chỉ áp dụng với hình chữ nhật.

còn hướng dẫn bạn sửa thì không. bạn học tập đi đừng ném chatgpt lên nhóm nhờ mọi người sửa.

  • Like 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

Mới học chưa biết rõ vòng lặp mà chơi code dài như này bảo sao tiến bộ nổi.

Bạn thử viết:

- 1 lisp chọn đối tượng CIRCLE nằm trong Rectang.

- 1 lisp chọn các CIRCLE xong in ra danh sách Point.

- 1 lisp xuất danh sách tọa độ qua excel hoặc txt.

Tất cả các lisp trên gần như đã có ở trên diễn đàn, khi nào biết viết được từng lisp thì bạn sẽ tự biết kết hợp. 

  • Like 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

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

×