| 160 | | {{{ |
| 161 | | #!python |
| 162 | | |
| 163 | | }}} |
| | 253 | Naslednji primer prikazuje izdelavo primera BottleCAD. Podrobnejši razdelek posameznih delov programske kode dobimo na [[http://trac.lecad.si/vaje/wiki/OpenCascade|MakeBottleCAD(C++)]]. |
| | 254 | {{{ |
| | 255 | #!python |
| | 256 | ##Copyright 2011 Simon Kulovec (simon.kulovec@lecad.si) |
| | 257 | ##Example: MakeCADBottle |
| | 258 | ##This file is part of pythonOCC. |
| | 259 | |
| | 260 | ## Importanje različnih knjižnic |
| | 261 | |
| | 262 | # Uporabniški vmesnik GUI |
| | 263 | from OCC.Display.SimpleGui import * |
| | 264 | |
| | 265 | # OpenCascade |
| | 266 | from OCC.gp import * |
| | 267 | from OCC.TopoDS import * |
| | 268 | from OCC.GC import * |
| | 269 | from OCC.BRepBuilderAPI import * |
| | 270 | from OCC.BRepPrimAPI import * |
| | 271 | from OCC.BRepFilletAPI import * |
| | 272 | from OCC.BRepAlgoAPI import * |
| | 273 | from OCC.Utils.Topology import * |
| | 274 | from OCC.Geom import * |
| | 275 | from OCC.Geom2d import * |
| | 276 | from OCC.GCE2d import * |
| | 277 | from OCC.BRep import * |
| | 278 | from OCC.BRepLib import * |
| | 279 | from OCC.BRepOffsetAPI import * |
| | 280 | from OCC.TopTools import * |
| | 281 | from OCC.TopAbs import * |
| | 282 | from OCC.TopExp import * |
| | 283 | |
| | 284 | import math |
| | 285 | |
| | 286 | def show_bottle(aRes): |
| | 287 | display.EraseAll() |
| | 288 | print dir(display) |
| | 289 | display.DisplayShape(aRes) |
| | 290 | |
| | 291 | def define_points(myWidth, myThickness, myHeight): |
| | 292 | #Definiranje začetnih točk |
| | 293 | aPnt1 = gp_Pnt(-myWidth / 2. , 0 , 0) |
| | 294 | aPnt2 = gp_Pnt(-myWidth / 2. , -myThickness / 4. , 0) |
| | 295 | aPnt3 = gp_Pnt(0 , -myThickness / 2. , 0) |
| | 296 | aPnt4 = gp_Pnt(myWidth / 2. , -myThickness / 4. , 0) |
| | 297 | aPnt5 = gp_Pnt(myWidth / 2. , 0 , 0) |
| | 298 | |
| | 299 | #Definiranje geometrije |
| | 300 | aArcOfCircle = GC_MakeArcOfCircle(aPnt2,aPnt3 ,aPnt4) |
| | 301 | aSegment1 = GC_MakeSegment(aPnt1 , aPnt2) |
| | 302 | aSegment2 = GC_MakeSegment(aPnt4 , aPnt5) |
| | 303 | |
| | 304 | #Definiranje topologije |
| | 305 | aEdge1 = BRepBuilderAPI_MakeEdge(aSegment1.Value()) |
| | 306 | aEdge2 = BRepBuilderAPI_MakeEdge(aArcOfCircle.Value()) |
| | 307 | aEdge3 = BRepBuilderAPI_MakeEdge(aSegment2.Value()) |
| | 308 | aWire = BRepBuilderAPI_MakeWire(aEdge1.Edge() , aEdge2.Edge() ,aEdge3.Edge()) |
| | 309 | |
| | 310 | #Izdelava celotnega profila - mirror |
| | 311 | xAxis = gp_OX() |
| | 312 | aTrsf = gp_Trsf() |
| | 313 | aTrsf.SetMirror(xAxis) |
| | 314 | aBRepTrsf = BRepBuilderAPI_Transform(aWire.Shape() , aTrsf) |
| | 315 | aMirroredShape = aBRepTrsf.Shape() |
| | 316 | aMirroredWire = TopoDS_wire(aMirroredShape) |
| | 317 | mkWire = BRepBuilderAPI_MakeWire() |
| | 318 | mkWire.Add(aWire.Wire()) |
| | 319 | mkWire.Add(aMirroredWire) |
| | 320 | myWireProfile = mkWire.Wire() |
| | 321 | |
| | 322 | # Telo: Iz profila se izdela telo |
| | 323 | myFaceProfile = BRepBuilderAPI_MakeFace(myWireProfile) |
| | 324 | aPrismVec = gp_Vec(0 , 0 , myHeight) |
| | 325 | myBody = BRepPrimAPI_MakePrism(myFaceProfile.Face() , aPrismVec) |
| | 326 | |
| | 327 | # Telo: Dodamo zaokrožitve (fillet) |
| | 328 | mkFillet = BRepFilletAPI_MakeFillet(myBody.Shape()) |
| | 329 | topology_traverser = Topo(myBody.Shape()) |
| | 330 | for aEdge in topology_traverser.edges(): |
| | 331 | mkFillet.Add(myThickness / 12. , aEdge) |
| | 332 | myBody = mkFillet.Shape() |
| | 333 | |
| | 334 | #Dodajanje grla na steklenico |
| | 335 | neckLocation = gp_Pnt(0, 0, myHeight) |
| | 336 | neckNormal = gp_DZ() |
| | 337 | neckAx2 = gp_Ax2(neckLocation, neckNormal) |
| | 338 | |
| | 339 | myNeckRadius = myThickness / 4 |
| | 340 | myNeckHeight = myHeight / 10 |
| | 341 | |
| | 342 | mkCylinder = BRepPrimAPI_MakeCylinder(neckAx2 , myNeckRadius , \ |
| | 343 | myNeckHeight) |
| | 344 | myNeck = mkCylinder.Shape(); |
| | 345 | |
| | 346 | myBody = BRepAlgoAPI_Fuse(myBody, myNeck) |
| | 347 | |
| | 348 | # Izdelava votle steklenice |
| | 349 | faceToRemove = None |
| | 350 | zMax = -1; |
| | 351 | t = Topo(myBody.Shape()) |
| | 352 | k=1 |
| | 353 | for aFace in t.faces(): |
| | 354 | |
| | 355 | aSurface = BRep_Tool().Surface(aFace) |
| | 356 | |
| | 357 | if aSurface.GetObject().IsInstance('Geom_Plane'): |
| | 358 | aPlane = Handle_Geom_Plane().DownCast(aSurface).GetObject() |
| | 359 | aPnt = aPlane.Location() |
| | 360 | aZ = aPnt.Z() |
| | 361 | if aZ>zMax: |
| | 362 | faceToRemove = aFace |
| | 363 | |
| | 364 | facesToRemove = TopTools_ListOfShape() |
| | 365 | facesToRemove.Append(faceToRemove) |
| | 366 | myBody = BRepOffsetAPI_MakeThickSolid(myBody.Shape() , facesToRemove , \ |
| | 367 | -myThickness/50 , 1.e-3) |
| | 368 | |
| | 369 | # Threading : Create Surfaces |
| | 370 | aCyl1 = Geom_CylindricalSurface(gp_Ax3(neckAx2) , myNeckRadius * 0.99) |
| | 371 | aCyl2 = Geom_CylindricalSurface(gp_Ax3(neckAx2) , myNeckRadius * 1.05) |
| | 372 | |
| | 373 | # Threading : Define 2D Curves |
| | 374 | aPnt = gp_Pnt2d(2. * 3.141592 , myNeckHeight / 2.) |
| | 375 | aDir = gp_Dir2d(2. * 3.141592 , myNeckHeight / 4.) |
| | 376 | aAx2d = gp_Ax2d(aPnt , aDir) |
| | 377 | |
| | 378 | aMajor = 2. * 3.141592 |
| | 379 | aMinor = myNeckHeight / 10. |
| | 380 | |
| | 381 | anEllipse1 = Geom2d_Ellipse(aAx2d , aMajor , aMinor) |
| | 382 | anEllipse2 = Geom2d_Ellipse(aAx2d , aMajor , aMinor / 4) |
| | 383 | |
| | 384 | aArc2 = Geom2d_TrimmedCurve(anEllipse1.GetHandle() , 3.141592, 0.) |
| | 385 | aArc1 = Geom2d_TrimmedCurve(anEllipse2.GetHandle() , 3.141592, 0.) |
| | 386 | |
| | 387 | anEllipsePnt2 = anEllipse1.Value(0.) |
| | 388 | anEllipsePnt1 = anEllipse1.Value(3.141592) |
| | 389 | |
| | 390 | aSegment = GCE2d_MakeSegment(anEllipsePnt1 , anEllipsePnt2) |
| | 391 | |
| | 392 | # Threading : Build Edges and Wires |
| | 393 | aEdge1OnSurf1 = BRepBuilderAPI_MakeEdge(aArc1.GetHandle() , aCyl1.GetHandle()) |
| | 394 | aEdge2OnSurf1 = BRepBuilderAPI_MakeEdge(aSegment.Value() , aCyl1.GetHandle()) |
| | 395 | aEdge1OnSurf2 = BRepBuilderAPI_MakeEdge(aArc2.GetHandle() , aCyl2.GetHandle()) |
| | 396 | aEdge2OnSurf2 = BRepBuilderAPI_MakeEdge(aSegment.Value() , aCyl2.GetHandle()) |
| | 397 | print dir(aEdge1OnSurf1) |
| | 398 | threadingWire1 = BRepBuilderAPI_MakeWire(aEdge1OnSurf1.Edge() , aEdge2OnSurf1.Edge()) |
| | 399 | threadingWire2 = BRepBuilderAPI_MakeWire(aEdge1OnSurf2.Edge() , aEdge2OnSurf2.Edge()) |
| | 400 | |
| | 401 | |
| | 402 | BRepLib().BuildCurves3d(threadingWire1.Wire()) |
| | 403 | BRepLib().BuildCurves3d(threadingWire2.Wire()) |
| | 404 | |
| | 405 | # Create Threading |
| | 406 | aTool = BRepOffsetAPI_ThruSections(True) |
| | 407 | |
| | 408 | aTool.AddWire(threadingWire1.Wire()) |
| | 409 | aTool.AddWire(threadingWire2.Wire()) |
| | 410 | aTool.CheckCompatibility(False) |
| | 411 | |
| | 412 | myThreading = aTool.Shape() |
| | 413 | |
| | 414 | # Izdelava sestava |
| | 415 | aRes = TopoDS_Compound() |
| | 416 | |
| | 417 | aBuilder = BRep_Builder() |
| | 418 | aBuilder.MakeCompound (aRes) |
| | 419 | |
| | 420 | aBuilder.Add (aRes, myBody.Shape()) |
| | 421 | aBuilder.Add (aRes, myThreading) |
| | 422 | |
| | 423 | # Izris oblike |
| | 424 | show_bottle(aPnt1) |
| | 425 | |
| | 426 | def draw_bottle(event=None): |
| | 427 | # Definiranje razdalj: širina, dolžina, višina |
| | 428 | myWidth = 50.0 |
| | 429 | myThickness = 30.0 |
| | 430 | myHeight = 70.0 |
| | 431 | # Define Points |
| | 432 | define_points(myWidth, myThickness, myHeight) |
| | 433 | |
| | 434 | if __name__ == '__main__': |
| | 435 | # OCC.Display.SimpleGui.init_display() returns multiple |
| | 436 | # values which are assigned here |
| | 437 | display, start_display, add_menu, add_function_to_menu = \ |
| | 438 | init_display() |
| | 439 | draw_bottle() #kličemo podprogram za izris bottle |
| | 440 | start_display() |
| | 441 | }}} |
| | 442 | |