NX Lab

Gộp, trừ, giao hai body bằng BooleanBuilder (Unite / Subtract / Intersect)

#Python#Boolean2 lượt xem

  1. Quản trị viênQuản trị· 0 điểm

    Câu hỏi ·

    Sau khi có nhiều body, cần gộp hoặc cắt chúng. BooleanBuilder nhận body đích và danh sách body công cụ, kèm tùy chọn giữ lại body gốc hay không.

    Gộp, trừ, giao hai body bằng… Gộp, trừ, giao hai body bằng…

    Các bước thực hiện

    1. Chọn target. builder.Target = body đích.
    2. Thêm tool. builder.Tools.Add([body công cụ]).
    3. Đặt phép toán. builder.Operation = BooleanType.Unite / Subtract / Intersect.
    4. Tùy chọn giữ body. RetainTarget, RetainTool.
    5. Commit. CommitFeature rồi Destroy.

    Code tham khảo (Python)

    import NXOpen
    
    BOOL = NXOpen.GeometricUtilities.BooleanOperation.BooleanType
    
    def boolean(part, target, tools, phep=BOOL.Unite, giu_tool=False):
        b = part.Features.CreateBooleanBuilderUsingCollector(NXOpen.Features.Feature.Null)
        try:
            b.Operation = phep
            b.Target = target
            b.RetainTarget = False
            b.RetainTool = giu_tool
            b.Tolerance = 0.01
            thu_vien = part.ScCollectors.CreateCollector()
            thu_vien.ReplaceRules([part.ScRuleFactory.CreateRuleBodyDumb(tools)], False)
            b.ToolBodyCollector = thu_vien
            return b.CommitFeature()
        finally:
            b.Destroy()
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        solids = [b for b in part.Bodies if b.IsSolidBody]
        lw.WriteLine("Có %d body đặc" % len(solids))
        if len(solids) < 2:
            lw.WriteLine("Cần ít nhất hai body (xem bài trước để tạo)")
            return
        session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Boolean")
        f = boolean(part, solids[0], solids[1:], BOOL.Unite)
        lw.WriteLine("Đã gộp: " + f.GetFeatureName())
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • CreateBooleanBuilderUsingCollector dùng collector cho tool body, là cách mà NX hiện đại ghi trong journal.
    • RetainTool = True giữ body công cụ nguyên vẹn, hữu ích khi dùng nó cắt nhiều chỗ.
    • Tolerance mặc định thường đủ; tăng nhẹ khi hai body chạm nhau sát mép.

    Lỗi thường gặp

    • Hai body không giao hoặc không chạm nhau thì Unite báo lỗi hoặc không tạo được.
    • Phép Subtract phụ thuộc thứ tự: đổi target và tool sẽ cho kết quả khác hẳn.

    Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.

    Điểm: 0

Trả lời

Đăng nhập để tham gia thảo luận.