【Claude SKILL vs Gemini 3.1 Pro】根据(智能无人船)系统描述进行FreeCAD 3D建模(附完整聊天记录)

由claude 自定义skill生成


Gemini 3.1 Pro

Gemini生成的Python建模源码:

python 复制代码
import FreeCAD as Appimport Partfrom FreeCAD import Vectorimport mathdef create_perfect_usv():    doc_name = "Industrial_USV_Perfect_Alignment"    try:        App.closeDocument(doc_name)    except: pass    doc = App.newDocument(doc_name)    # ================= 配色体系 =================    C_HULL = (0.15, 0.15, 0.17); C_DECK = (0.5, 0.5, 0.53)    C_WHITE = (0.85, 0.85, 0.88); C_ORANGE = (1.0, 0.35, 0.0)    C_BLACK = (0.05, 0.05, 0.07); C_SOLAR = (0.05, 0.1, 0.3)    def add_obj(shape, name, color, group=None):        obj = doc.addObject("Part::Feature", name)        obj.Shape = shape        obj.ViewObject.ShapeColor = color        if group: group.addObject(obj)        return obj    def make_stealth_box(L, W, H, inset):        b_pts = [Vector(-L/2,-W/2,0), Vector(L/2,-W/2,0), Vector(L/2,W/2,0), Vector(-L/2,W/2,0), Vector(-L/2,-W/2,0)]        t_pts = [Vector(-L/2+inset,-W/2+inset,H), Vector(L/2-inset,-W/2+inset,H), Vector(L/2-inset,W/2-inset,H), Vector(-L/2+inset,W/2-inset,H), Vector(-L/2+inset,-W/2+inset,H)]        return Part.makeLoft([Part.makePolygon(b_pts), Part.makePolygon(t_pts)], True)    # ================= 核心布局参数 (全局锚点) =================    L_TOTAL = 6000    SPACING = 1800    R_HULL = 350    # 关键部位的 X 轴中心位置    X_CABIN_CENTER = 3000  # 机舱中心    X_MAST_FRONT   = 4500  # 桅杆所在位置    X_RTK_BACK     = 2200  # RTK天线所在位置    # Z 轴高度基准    Z_DECK_TOP = 480       # 甲板顶面高度    Z_CABIN_TOP = Z_DECK_TOP + 500  # 机舱顶面 (980)    Z_MAST_TOP = 2000      # 桅杆横梁高度    # 1. 船体与甲板    for side in [1, -1]:        y = (SPACING/2) * side        p_mid = Part.makeCylinder(R_HULL, 4000, Vector(1000,y,0), Vector(1,0,0))        p_bow = Part.makeCone(R_HULL, 0, 1000, Vector(5000,y,0), Vector(1,0,0))        p_stern = Part.makeCone(R_HULL*0.6, R_HULL, 1000, Vector(0,y,0), Vector(1,0,0))        add_obj(p_mid.fuse(p_bow).fuse(p_stern), f"Hull_{side}", C_HULL)    deck = make_stealth_box(4500, SPACING+400, 150, 100)    deck.translate(Vector(L_TOTAL/2, 0, 330))    add_obj(deck, "Main_Deck", C_DECK)    # 2. 机舱与太阳能板    cabin = make_stealth_box(2200, 1200, 500, 150)    cabin.translate(Vector(X_CABIN_CENTER, 0, Z_DECK_TOP))    add_obj(cabin, "Cabin", C_WHITE)    solar = Part.makeBox(1500, 800, 10)    solar.translate(Vector(X_CABIN_CENTER-750, -400, Z_CABIN_TOP))    add_obj(solar, "Solar_Panel", C_SOLAR)    # 3. 桅杆系统 (Mast) - 使用直接坐标定义连线,确保不脱节    # 横梁    mast_crossbar = Part.makeCylinder(40, SPACING, Vector(X_MAST_FRONT, -SPACING/2, Z_MAST_TOP), Vector(0,1,0))    add_obj(mast_crossbar, "Mast_Crossbar", C_HULL)    # 倾斜支柱 - 从甲板连向横梁两端    for side in [1, -1]:        p_bot = Vector(X_MAST_FRONT-300, (SPACING/2-100)*side, Z_DECK_TOP) # 脚部        p_top = Vector(X_MAST_FRONT, (SPACING/2-100)*side, Z_MAST_TOP)      # 顶部        leg = Part.makeCylinder(40, (p_top-p_bot).Length, p_bot, p_top-p_bot)        add_obj(leg, f"Mast_Leg_{side}", C_HULL)    # 4. 感知设备 (挂在横梁上)    # LiDAR - 放在横梁中间上方    lidar = Part.makeCylinder(50, 100, Vector(X_MAST_FRONT, 0, Z_MAST_TOP+40), Vector(0,0,1))    add_obj(lidar, "LiDAR", C_WHITE)    # PTZ 相机 - 挂在横梁中间下方    ptz_base = Part.makeBox(100, 100, 50)    ptz_base.translate(Vector(X_MAST_FRONT-50, -50, Z_MAST_TOP-90))    ptz_ball = Part.makeSphere(70)    ptz_ball.translate(Vector(X_MAST_FRONT, 0, Z_MAST_TOP-150))    add_obj(ptz_base.fuse(ptz_ball), "Camera_PTZ", C_WHITE)    # 5. 通信与雷达 (放在机舱顶上)    # 航海雷达    radar_base = Part.makeCylinder(40, 200, Vector(X_CABIN_CENTER+500, 0, Z_CABIN_TOP), Vector(0,0,1))    radar_bar = Part.makeBox(100, 1000, 40)    radar_bar.translate(Vector(X_CABIN_CENTER+500-50, -500, Z_CABIN_TOP+200))    add_obj(radar_base.fuse(radar_bar), "Navigation_Radar", C_WHITE)    # RTK 天线    for side in [1, -1]:        y = 450 * side        pole = Part.makeCylinder(15, 500, Vector(X_RTK_BACK, y, Z_CABIN_TOP), Vector(0,0,1))        head = Part.makeCylinder(60, 30, Vector(X_RTK_BACK, y, Z_CABIN_TOP+500), Vector(0,0,1))        add_obj(pole.fuse(head), f"RTK_{side}", C_WHITE)    # 卫星穹顶 (Sat-Dome)    sat_base = Part.makeCylinder(180, 100, Vector(X_CABIN_CENTER-600, 0, Z_CABIN_TOP), Vector(0,0,1))    sat_dome = Part.makeSphere(180)    sat_dome.translate(Vector(X_CABIN_CENTER-600, 0, Z_CABIN_TOP+100))    add_obj(sat_base.fuse(sat_dome), "SatCom_Dome", C_WHITE)    # 6. 推进与声呐    # 喷水推进器    for side in [1, -1]:        jet = Part.makeCylinder(200, 500, Vector(-200, (SPACING/2)*side, 0), Vector(1,0,0))        nozzle = Part.makeCone(200, 100, 300, Vector(-500, (SPACING/2)*side, 0), Vector(1,0,0))        add_obj(jet.fuse(nozzle), f"WaterJet_{side}", C_BLACK)    # 水下声呐及连接杆    sonar_pole = Part.makeCylinder(30, 800, Vector(X_MAST_FRONT, 0, -400), Vector(0,0,1))    sonar_head = Part.makeBox(400, 250, 120)    sonar_head.translate(Vector(X_MAST_FRONT-200, -125, -520))    add_obj(sonar_pole.fuse(sonar_head), "Sonar_System", C_ORANGE)    # 界面更新    doc.recompute()    try:        import FreeCADGui        FreeCADGui.ActiveDocument.ActiveView.viewAxometric()        FreeCADGui.ActiveDocument.ActiveView.fitAll()    except: passcreate_perfect_usv()