NX Lab

Tạo phôi (blank) từ hộp bao + lượng dư bằng Block feature để dùng làm WORKPIECE trong CAM

#Python#Phôi#CAM1 lượt xem

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

    Câu hỏi ·

    WORKPIECE trong CAM cần một body phôi. Tính hộp bao của chi tiết, cộng lượng dư mỗi phía rồi tạo khối hộp ở đúng vị trí là cách nhanh để có phôi chuẩn cho mọi chi tiết.

    Tạo phôi (blank) từ hộp bao + lượng dư… Tạo phôi (blank) từ hộp bao + lượng dư…

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

    1. Tính hộp bao. Min, max theo ba trục.
    2. Cộng lượng dư. Dư mỗi phía theo từng trục.
    3. Tạo khối. BlockFeatureBuilder với gốc là góc nhỏ nhất.
    4. Đổi tên và layer. Phôi ở layer riêng và tên PHOI.
    5. Ẩn phôi. Để không che chi tiết.

    Code tham khảo (Python)

    import NXOpen
    
    def hop_bao(body):
        xs, ys, zs = [], [], []
        for e in body.GetEdges():
            for p in e.GetVertices():
                xs.append(p.X); ys.append(p.Y); zs.append(p.Z)
        return (min(xs), min(ys), min(zs)), (max(xs), max(ys), max(zs))
    
    def tao_phoi(part, body, du=(2.0, 2.0, 2.0, 2.0, 2.0, 1.0), layer_phoi=10):
        """du = (xmin, xmax, ymin, ymax, zmin, zmax) lượng dư mỗi phía."""
        lo, hi = hop_bao(body)
        goc = (lo[0] - du[0], lo[1] - du[2], lo[2] - du[4])
        dai = (hi[0] + du[1]) - goc[0]
        rong = (hi[1] + du[3]) - goc[1]
        cao = (hi[2] + du[5]) - goc[2]
        b = part.Features.CreateBlockFeatureBuilder(NXOpen.Features.Feature.Null)
        try:
            b.Type = NXOpen.Features.BlockFeatureBuilder.Types.OriginAndEdgeLengths
            b.SetOriginAndLengths(NXOpen.Point3d(*goc), str(dai), str(rong), str(cao))
            feat = b.CommitFeature()
        finally:
            b.Destroy()
        phoi = feat.GetBodies()[0]
        phoi.SetName("PHOI")
        phoi.Layer = layer_phoi
        return phoi, (dai, rong, cao)
    
    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 and b.Name != "PHOI"] if part else []
        if not solids:
            lw.WriteLine("Không có body chi tiết")
            return
        session.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "Tao phoi")
        phoi, kich = tao_phoi(part, solids[0])
        lw.WriteLine("Đã tạo phôi %.1f x %.1f x %.1f (layer %d)" % (kich[0], kich[1], kich[2], phoi.Layer))
        session.DisplayManager.BlankObjects([phoi])
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Lượng dư riêng cho từng phía (sáu số) cho phép dư lớn ở mặt gá, nhỏ ở mặt còn lại.
    • feat.GetBodies() lấy body sinh ra từ feature để đổi tên và layer.
    • Ẩn phôi bằng BlankObjects để màn hình chỉ còn chi tiết, nhưng vẫn dùng được cho WORKPIECE.

    Lỗi thường gặp

    • Hộp bao theo đỉnh cạnh có thể thiếu phần cung tròn lồi; thêm dư an toàn nếu chi tiết có cung lớn.
    • Mô hình xoay nghiêng cho phôi thừa lớn; xoay chi tiết về hệ tọa độ gia công trước.

    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.