Macro BoundingBox Tracing

From FreeCAD Documentation
Revision as of 19:47, 8 May 2017 by Mario52 (talk | contribs) (ver 0.5 le 08/05/2017)

File:BoundBoxTracing Macro BoundingBox Tracing

Description
This macro red trace (editable) around the BoundingBox with 6 rectangles.

Macro version: 0.5 (08/05/2016)
Author: Mario52
Author
Mario52
Download
None
Links
Macro Version
0.5 (08/05/2016)
Date last modified
None
FreeCAD Version(s)
None
Default shortcut
None
See also
None

Description

This macro red trace (editable) around the BoundingBox 6 Faces with 6 rectangles.

CenterFace

Use

Select the object and launch the macro. 6 rectangles are colored red (can be changed)

If createVol = 1 (Line 29) one volume is created

To change the color of the dot change the lines 37, 38, 39

red   = 1.0  # 1 = 255
    green = 0.0  #
    blue  = 0.0  #

Icon

Download the file image and copy in your macro repertory.

Click the image, in the new window position the mouse over the image, click the right mouse and do "Save target as ..."

Button

Macro

Macro_BoundingBox_Tracing.FCMacro

# -*- coding: utf-8 -*-
# cette macro trace en rouge (modifiable) le tour du boundingbox avec 6 rectangles
# si "createVol" = 1 il sera cree un volume (rouge) de la dimension du BoundBox
# this macro red trace (editable) around the BoundingBox with 6 rectangles
# if "createVol" = 1 on volume (red) is created 
# Macro_BoundingBox_Tracing
#
#OS: Windows Vista       #OS: Windows 8.1                                  #OS: Windows 10
#Platform: 32-bit        #Word size of OS: 64-bit                          #Word size of OS: 64-bit
#Version: 0.14.3389      #Word size of FreeCAD: 64-bit                     #Word size of FreeCAD: 64-bit
#Python version: 2.6.2   #Version: 0.15.4671 (Git)                         #Version: 0.16.6700 (Git)
#Qt version: 4.5.2       #Branch: releases/FreeCAD-0-15                    #Build type: Release
#Coin version: 3.1.0     #Hash: 244b3aef360841646cbfe80a1b225c8b39c8380c   #Branch: releases/FreeCAD-0-16
#SoQt version: 1.4.1     #Python version: 2.7.8                            #Hash: 7b925d11aa69ac405b423635adb1e2833f18a817
#OCC version: 6.5.1      #Qt version: 4.8.6                                #Python version: 2.7.8
#                        #Coin version: 4.0.0a                             #Qt version: 4.8.6
#                        #OCC version: 6.8.0.oce-0.17                      #Coin version: 4.0.0a
                                                                           #OCC version: 6.8.0.oce-0.17

__title__   = "BoundingBox_Tracing"
__author__  = "Mario52"
__url__     = "http://www.freecadweb.org/index-fr.html"
__version__ = "0.5"
__date__    = "08/05/2017"

import FreeCAD, FreeCADGui, Draft, Part
App = FreeCAD

createVol = 1            # give 1 for create Volume # mettre a 1 pour creer un volume

selEx = FreeCADGui.Selection.getSelectionEx()
objs = [selobj.Object for selobj in selEx]
if len(objs) >= 1:
    if hasattr(objs[0], "Shape"):
        s = objs[0].Shape
    elif hasattr(objs[0], "Mesh"):      # upgrade with wmayer thanks #http://forum.freecadweb.org/viewtopic.php?f=13&t=22331
        s = objs[0].Mesh
    elif hasattr(objs[0], "Points"):
        s = objs[0].Points

    # LineColor
    red   = 1.0  # 1 = 255
    green = 0.0  #
    blue  = 0.0  #

    # boundBox
    boundBox_ = s.BoundBox
    boundBoxLX = boundBox_.XLength
    boundBoxLY = boundBox_.YLength
    boundBoxLZ = boundBox_.ZLength

    a = str(boundBox_)
    a,b = a.split('(')
    c = b.split(',')
    oripl_X = float(c[0])
    oripl_Y = float(c[1])
    oripl_Z = float(c[2])

    App.Console.PrintMessage(str(boundBox_)+"\r\n")
    App.Console.PrintMessage("Rectangle      : "+str(boundBox_.XLength)+" x "+str(boundBox_.YLength)+" x "+str(boundBox_.ZLength)+"\r\n")

    if (createVol == 1) and (boundBoxLX > 0) and (boundBoxLY > 0) and (boundBoxLZ > 0):  # Create Volume
        BDvol = App.ActiveDocument.addObject("Part::Box","BoundBoxVolume")
        #BDvol.Label = "BoundBoxVolume"
        BDvol.Length.Value = boundBoxLX
        BDvol.Width.Value  = boundBoxLY
        BDvol.Height.Value = boundBoxLZ
        BDvol.Placement=App.Placement(App.Vector(oripl_X,oripl_Y,oripl_Z), App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))
        FreeCADGui.ActiveDocument.getObject(BDvol.Name).LineColor  = (red, green, blue)
        FreeCADGui.ActiveDocument.getObject(BDvol.Name).PointColor = (red, green, blue)
        FreeCADGui.ActiveDocument.getObject(BDvol.Name).ShapeColor = (red, green, blue)
        FreeCADGui.ActiveDocument.getObject(BDvol.Name).Transparency = 80
        App.Console.PrintMessage("BoundBoxVolume : " + str(BDvol.Shape.Volume)+"\r\n")
    else:
        App.Console.PrintMessage("Not BoundBox possible"+"\r\n")
    App.Console.PrintMessage("_____________________"+"\r\n")

    #####
    try:
        if (boundBox_.XLength and boundBox_.YLength) > 0.0:
            pl_0 = App.Placement(App.Vector(oripl_X,oripl_Y,oripl_Z), App.Rotation(0.0,0.0,0.0))
            double = Draft.makeRectangle(length=boundBox_.XLength,height=boundBox_.YLength,placement=pl_0,face=False,support=None) #OK
            double.Label = "BoundBoxRectangle_Bo"
            FreeCADGui.activeDocument().activeObject().LineColor = (red, green, blue)
#        else:
#            App.Console.PrintError("not value 0"+"\n")
    except:
        App.Console.PrintError("not done 0"+"\n")
    try:
        if (boundBox_.XLength and boundBox_.YLength) > 0.0:
            pl_1 = App.Placement(App.Vector(oripl_X,oripl_Y,oripl_Z+boundBoxLZ), App.Rotation(0.0,0.0,0.0))
            double = Draft.makeRectangle(length=boundBox_.XLength,height=boundBox_.YLength,placement=pl_1,face=False,support=None) #Ok
            double.Label = "BoundBoxRectangle_To"
            FreeCADGui.activeDocument().activeObject().LineColor = (red, green, blue)
#        else:
#            App.Console.PrintError("not value 1"+"\n")
    except:
        App.Console.PrintError("not done 1"+"\n")
    try:
        if (boundBox_.XLength and boundBox_.ZLength) > 0.0:
            pl_2 = App.Placement(App.Vector(oripl_X,oripl_Y,oripl_Z), App.Rotation(0.0,0.0,90))
            double = Draft.makeRectangle(length=boundBox_.XLength,height=boundBox_.ZLength,placement=pl_2,face=False,support=None) #Ok
            double.Label = "BoundBoxRectangle_Fr"
            FreeCADGui.activeDocument().activeObject().LineColor = (red, green, blue)
#        else:
#            App.Console.PrintError("not value 2"+"\n")
    except:
        App.Console.PrintError("not done 2"+"\n")
    try:
        if (boundBox_.XLength and boundBox_.ZLength) > 0.0:
            pl_3 = App.Placement(App.Vector(oripl_X,oripl_Y+boundBoxLY,oripl_Z), App.Rotation(0.0,0.0,90))
            double = Draft.makeRectangle(length=boundBox_.XLength,height=boundBox_.ZLength,placement=pl_3,face=False,support=None) #Ok
            double.Label = "BoundBoxRectangle_Re"
            FreeCADGui.activeDocument().activeObject().LineColor = (red, green, blue)
#        else:
#            App.Console.PrintError("not value 3"+"\n")
    except:
        App.Console.PrintError("not done 3"+"\n")
    try:
        if (boundBoxLY and boundBox_.ZLength) > 0.0:
            pl_4 = App.Placement(App.Vector(oripl_X,oripl_Y,oripl_Z), App.Rotation(90,0.0,90))
            double = Draft.makeRectangle(length=boundBoxLY,height=boundBox_.ZLength,placement=pl_4,face=False,support=None) #Ok
            double.Label = "BoundBoxRectangle_Le"
            FreeCADGui.activeDocument().activeObject().LineColor = (red, green, blue)
#        else:
#            App.Console.PrintError("not value 4"+"\n")
    except:
        App.Console.PrintError("not done 4"+"\n")
    try:
        if (boundBoxLY and boundBoxLZ) > 0.0:
            pl_5 = App.Placement(App.Vector(oripl_X+boundBoxLX,oripl_Y,oripl_Z), App.Rotation(90,0.0,90))
            double = Draft.makeRectangle(length=boundBoxLY,height=boundBoxLZ,placement=pl_5,face=False,support=None) #Ok
            double.Label = "BoundBoxRectangle_Ri"
            FreeCADGui.activeDocument().activeObject().LineColor = (red, green, blue)
#        else:
#            App.Console.PrintError("not value 5"+"\n")
    except:
        App.Console.PrintError("not done 5"+"\n")
    #####
    App.ActiveDocument.recompute()
else:
    App.Console.PrintMessage("Select an object !"+"\n")

Version

ver 0.5 le 08/05/2017 : upgrade now accept the "mesh" and "Points" thanks wmayer Makro Bounding-Box für STL importierte Teile und für Punktewolken

ver 0.4 le 04/06/2016 : test if value = 0 then not create boundbox (ex: object Draft)