Macro FCInfoGlass
File:Macro FCInfoGlass Macro FCInfoGlass |
Description |
---|
Gives a series of information on the form display in the 3D view. Author: Mario52 |
Author |
Mario52 |
Download |
None |
Links |
Macros recipes How to install macros How to customize toolbars |
Macro Version |
1.0 |
Date last modified |
None |
FreeCAD Version(s) |
None |
Default shortcut |
None |
See also |
None |
Gives a series of informations about the selected shape and can display a directly in the 3D view
Utilisation
Select an object or launch the application and select an object, and a series of informations appear on the 3D View.
Modify this line to move the data display in the screen (lines 147, 148)
posiX = 300 # position window coordinate X
posiY = 190 # position window coordinate Y
- 300, 190 = position X, Y upper left corner
This section hare switch give value 1 for displayed the info or 0 for not displayed the info
EX:
is displayed
global LabelObject ;LabelObject = 1 # Label #3
is not displayed
global LabelObject ;LabelObject = 0 # Label #3
The section lines 84 to 102
################################################
# section switch
# if switch = 1 then actif (True Displayed) else inactif (False not Displayed)
global DocumentName ;DocumentName = 1 # Nom du document #1
global InternalName ;InternalName = 1 # Nom interne de l'objet #2
global LabelObject ;LabelObject = 1 # Label #3
global ElementName ;ElementName = 1 # Nom de l'element #4
global ObjectType ;ObjectType = 1 # Type d'objet #5
global ObjectLength ;ObjectLength = 1 # longueur Objet #6
global FaceSurface ;FaceSurface = 1 # Surface de la face #7
global FaceCenter ;FaceCenter = 1 # Center Face (mass) #8
global BoundBoxFaceVol ;BoundBoxFaceVol = 1 # BoundBoxFace Volume #9
global BoundBoxFaceCoor;BoundBoxFaceCoor = 1 # BoundBoxFace coordinates #10
global BoundBoxFaceC ;BoundBoxFaceC = 1 # BoundBoxFaceCenter #11
global VolumeObject ;VolumeObject = 1 # volume #12
global BounboxVolume ;BounboxVolume = 1 # rectangle du BoundBox #13
global BounboxCoord ;BounboxCoord = 1 # boundinbox (dimensions hors tout) #14
global BounboxCenter ;BounboxCenter = 1 # centre de la forme #15
global CenterMass ;CenterMass = 1 # centre de la masse #16
global LineInclination ;LineInclination = 1 # search inclination XY YZ ZX uniquement lignes #17
global VertexesObject ;VertexesObject = 1 # Vertexes de l'objet selectionne #18
global VertexesForme ;VertexesForme = 0 # Vertexes complet de la forme #19
# peut prendre du temps, depasser la fenetre et donner des donnees incompletes
# can take time and exceed the window and give data's incompletes
################################################
It is not possible at the moment to leave the function from the macro or scrolling
One mouse click on the object display the information of the object, two mouse click select the object complete and displayed alls informations
(it is possible you can not see everything informations in the window for the moment)
Script
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
"""
***************************************************************************
* Copyright (c) 2015 <mario52> *
* *
* This file is a supplement to the FreeCAD CAx development system. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License (LGPL) *
* as published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* for detail see the LICENCE text file. *
* *
* This software is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this macro; if not, write to the Free Software *
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
* USA *
***************************************************************************
* WARNING! All changes in this file will be lost and *
* may cause malfunction of the program *
***************************************************************************
"""
#30/07/2015 04/08/2015
#
#OS: Windows 8
#Word size of OS: 64-bit
#Word size of FreeCAD: 64-bit
#Version: 0.15.4671 (Git)
#Branch: releases/FreeCAD-0-15
#Hash: 244b3aef360841646cbfe80a1b225c8b39c8380c
#Python version: 2.7.8
#Qt version: 4.8.6
#Coin version: 4.0.0a
#OCC version: 6.8.0.oce-0.17
#
__title__="FCInfoGlass"
__author__ = "Mario52"
__url__ = "http://www.freecadweb.org/index-fr.html"
__version__ = "00.02"
__date__ = "04/08/2015"
__Comment__ = "displays various information on the screen"
__Web__ = ""
__Wiki__ = ""
__Icon__ = "/usr/lib/freecad/Mod/plugins/icons/.png"
__IconW__ = "C:/Documents and Settings/YourUserName/Application Data/FreeCAD"
__Help__ = ""
__Status__ = "not finished"
__Requires__ = "FreeCAD 0.14.3706"
__Communication__ = "http://www.freecadweb.org/wiki/index.php?title=User:Mario52"
try:
import PyQt4
from PyQt4 import QtGui ,QtCore
from PyQt4.QtGui import *
from PyQt4.QtCore import *
except Exception:
import PySide
from PySide import QtGui ,QtCore
from PySide.QtGui import *
from PySide.QtCore import *
import Draft, Part, FreeCAD, math, PartGui, FreeCADGui, FreeCAD
from math import degrees, radians, atan2, sqrt, pi, sin, cos, asin, acos, atan
from FreeCAD import Base
global path
#path = FreeCAD.ConfigGet("AppHomePath")
path = FreeCAD.ConfigGet("UserAppData")
global compteur ; compteur = 0 # compteur objets
global texteInfo ; texteInfo = ""# texte
global mode ; mode = 1 # mode 1=degres mode 0=radians
################################################
# section switch
# if switch = 1 then actif (True Displayed) else inactif (False not Displayed)
global DocumentName ;DocumentName = 1 # Nom du document #1
global InternalName ;InternalName = 1 # Nom interne de l'objet #2
global LabelObject ;LabelObject = 1 # Label #3
global ElementName ;ElementName = 1 # Nom de l'element #4
global ObjectType ;ObjectType = 1 # Type d'objet #5
global ObjectLength ;ObjectLength = 1 # longueur Objet #6
global FaceSurface ;FaceSurface = 1 # Surface de la face #7
global FaceCenter ;FaceCenter = 1 # Center Face (mass) #8
global BoundBoxFaceVol ;BoundBoxFaceVol = 1 # BoundBoxFace Volume #9
global BoundBoxFaceCoor;BoundBoxFaceCoor = 1 # BoundBoxFace coordinates #10
global BoundBoxFaceC ;BoundBoxFaceC = 1 # BoundBoxFaceCenter #11
global VolumeObject ;VolumeObject = 1 # volume #12
global BounboxVolume ;BounboxVolume = 1 # rectangle du BoundBox #13
global BounboxCoord ;BounboxCoord = 1 # boundinbox (dimensions hors tout) #14
global BounboxCenter ;BounboxCenter = 1 # centre de la forme #15
global CenterMass ;CenterMass = 1 # centre de la masse #16
global LineInclination ;LineInclination = 1 # search inclination XY YZ ZX uniquement lignes #17
global VertexesObject ;VertexesObject = 1 # Vertexes de l'objet selectionne #18
global VertexesForme ;VertexesForme = 0 # Vertexes complet de la forme #19
# peut prendre du temps, depasser la fenetre et donner des donnees incompletes
# can take time and exceed the window and give data's incompletes
################################################
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
def angle2(vecteur_x1,vecteur_y1,vecteur_x2,vecteur_y2,mode):
# calcul de l'inclinaison d'une ligne a partir de deux Vecteurs
# si "mode" = 1 alors affichage en degres sinon en radian
try:
deltaX = vecteur_x2 - vecteur_x1
deltaY = vecteur_y2 - vecteur_y1
if mode ==1:
angle = degrees(atan2(float(deltaY),float(deltaX))) # degres
else:
angle = atan2(float(deltaY),float(deltaX)) # radian
return round(angle,6)
except Exception:
return 0
class Ui_MainWindow(object):
global path
global texteInfo
def setupUi(self, MainWindow):
self.window = MainWindow
global path
global texteInfo
SizeX = 600 # size window length
SizeY = 600 # size window heigth
posiX = 300 # position window coordinate X
posiY = 190 # position window coordinate Y
MainWindow.setObjectName("MainWindow")
MainWindow.setWindowTitle("FCInfoGlass ")
MainWindow.resize(SizeX, SizeY) # dimenssions exterieures de la fenetre
MainWindow.setMinimumSize(QtCore.QSize(SizeX, SizeY)) #
MainWindow.setMaximumSize(QtCore.QSize(SizeX, SizeY)) #
MainWindow.setGeometry(posiX, posiY, SizeX, SizeY) # coin superieur X,Y coin inferieur X,Y positionne la fenetre dans l'ecran
# modify this line for posionned the window
MainWindow.setWindowOpacity(1) # rend la fenetre +/- opaque
MainWindow.setWindowFlags(QtCore.Qt.FramelessWindowHint) # rend la fenêtre transparente et cache le cadre
MainWindow.setAttribute(QtCore.Qt.WA_TranslucentBackground, True) # ne pas bouger ,True
MainWindow.setStyleSheet("background:transparent;") # rend le fond transparent
self.istransparent = True
#############################################
################ test bouton
# self.frame = QtGui.QFrame(MainWindow)
# self.frame.setGeometry(QtCore.QRect(10, 370, 381, 24))
# self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
# self.frame.setFrameShadow(QtGui.QFrame.Raised)
# self.frame.setObjectName(_fromUtf8("frame"))
# self.PBQuit = QtGui.QPushButton(self.frame)
# self.PBQuit.setGeometry(QtCore.QRect(0, 0, 101, 23))
# self.PBQuit.setObjectName(_fromUtf8("PBQuit"))
# self.PBQuit.clicked.connect(self.on_PBQuit) ###
###################
# self.frame.setWindowOpacity(1) # rend la fenetre +/- opaque
# self.frame.setWindowFlags(QtCore.Qt.FramelessWindowHint) # rend la fenêtre transparente et cache le cadre
# self.frame.setAttribute(QtCore.Qt.WA_TranslucentBackground, True) # ne pas bouger ,True
# self.frame.setStyleSheet("background:transparent;") # rend le fond transparent
# self.istransparent = True
#########################################
# #cree un cadre aux dimensions MainWindow.resize(400, 400) mais cache la fenetre textEdit OK
# self.centralWidget = QtGui.QWidget(MainWindow)
# self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
# self.tableWidget = QtGui.QTableWidget(self.centralWidget)
# self.tableWidget.setGeometry(QtCore.QRect(0, 0, 400, 400))
##########################################
MainWindow.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint) # met la fenetre en avant
self.centralWidget = QtGui.QWidget(MainWindow)
self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
self.label = QtGui.QLabel(self.centralWidget)
self.label.setGeometry(QtCore.QRect(10, 20, SizeX, SizeY)) # positionne le label (texte) et donne son occupation (surface cadre)abscisse, ordonnee, largeur, hauteur
self.label.setObjectName(_fromUtf8("label"))
MainWindow.setCentralWidget(self.centralWidget)
self.retranslateUi(MainWindow)
# self.PBQuit.setText("Quit")
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle("Dialog")
# self.PBQuit.setText("Quit")
self.label.setText("")
def on_pushButton_Raf_clicked(self): # affiche le texte concatene dans la fenetre
global texteInfo
self.label.setText(texteInfo + "\n")
# def on_PBQuit(self):
# App.Console.PrintMessage(str("Fin FCTransparencyInfo ")+"\n")
# self.window.hide()
class SelObserver:
def addSelection(self,document, object, element, position): # Selection
global texteInfo
global compteur
global DocumentName
global InternalName
global LabelObject
global ElementName
global ObjectType
global ObjectLength
global FaceSurface
global FaceCenter
global BoundBoxFaceVol
global BoundBoxFaceCoor
global BoundBoxFaceC
global VolumeObject
global BounboxVolume
global BounboxCoord
global BounboxCenter
global CenterMass
global LineInclination
global VertexesObject
global VertexesForme
texteInfo = ""
compteur = 0
arondi = 5
def Around(a) :
return round(a,arondi)
sel = FreeCADGui.Selection.getSelection()
try:
Object = Gui.Selection.getSelectionEx()[0].SubObjects[0]
except:
None
# Nom du document #1
if DocumentName == 1:
try:
App.Console.PrintMessage("Document name : "+str(FreeCAD.activeDocument().Name)+"\n")
compteur += 1
texteInfo += " "+(str(compteur)+" : "+"Document name")+" : "+str(FreeCAD.activeDocument().Name)+"\n"
except:
None
# Nom interne de l'objet #2
if InternalName == 1:
try:
App.Console.PrintMessage("Object name : "+str(sel[0].Name)+"\n")
compteur += 1
texteInfo += " "+(str(compteur)+" : "+"Object name")+"\t : "+str(sel[0].Name)+"\n"
except:
None
# Label #3
if LabelObject == 1:
try:
App.Console.PrintMessage("Label name : "+str(sel[0].Label)+"\n")
compteur += 1
texteInfo += " "+(str(compteur)+" : "+"Label name")+"\t : "+str(sel[0].Label)+"\n"
except:
None
# Nom de l'element #4
if ElementName == 1:
try:
SubElement = FreeCADGui.Selection.getSelectionEx()
element_ = SubElement[0].SubElementNames[0]
App.Console.PrintMessage("Element name : "+str(element_)+"\n")
compteur += 1
texteInfo += " "+(str(compteur)+" : "+"Element name")+"\t : "+str(element_)+"\n"
except:
None
# Type d'objet #5
if ObjectType == 1:
try:
typeObject = sel[0].Shape.ShapeType
App.Console.PrintMessage("Object type : "+typeObject+"\n")
compteur += 1
texteInfo += " "+(str(compteur)+" : "+"Object type")+"\t : "+typeObject+"\n"
except:
None
# longueur Objet #6
if ObjectLength == 1:
try:
App.Console.PrintMessage("Object lenght : "+str(Gui.Selection.getSelectionEx()[0].SubObjects[0].Length)+"\n")
compteur += 1
texteInfo += " "+(str(compteur)+" : "+"Object lenght")+"\t : "+str(Gui.Selection.getSelectionEx()[0].SubObjects[0].Length)+"\n"
except:
None
# Surface de la face #7
if FaceSurface == 1:
try:
App.Console.PrintMessage("Face area : "+str(Gui.Selection.getSelectionEx()[0].SubObjects[0].Area)+"\n")
compteur += 1
texteInfo += " "+(str(compteur)+" : "+"Face area")+"\t : "+str(Gui.Selection.getSelectionEx()[0].SubObjects[0].Area)+"\n"
except:
None
# Center Face (mass) #8
if FaceCenter == 1:
try:
det = Gui.Selection.getSelectionEx()[0].SubObjects[0].CenterOfMass
App.Console.PrintMessage("Face center : "+str(det[0])+", "+str(det[1])+", "+str(det[2])+"\n") # Vector center mass to face
compteur += 1
texteInfo += " "+(str(compteur)+" : "+"Face center")+"\t : "+str(det[0])+", "+str(det[1])+", "+str(det[2])+"\n"
except:
None
# BoudBox Face Volume #9
if BoundBoxFaceVol == 1:
try:
det = Gui.Selection.getSelectionEx()[0].SubObjects[0]
App.Console.PrintMessage("Face BoundBox Vol : "+str(det.BoundBox.XLength)+" x "+str(det.BoundBox.YLength)+" x "+str(det.BoundBox.ZLength)+"\n") # BoundBoxFace face volume
compteur += 1
texteInfo += " "+(str(compteur)+" : "+"Face BBox Volume")+" : "+str(det.BoundBox.XLength)+" x "+str(det.BoundBox.YLength)+" x "+str(det.BoundBox.ZLength)+"\n"
except:
None
# BoudBox Face Coordinates #10
if BoundBoxFaceCoor == 1:
try:
det = Gui.Selection.getSelectionEx()[0].SubObjects[0]
App.Console.PrintMessage("Face BoundBox Coor : "+str(Gui.Selection.getSelectionEx()[0].SubObjects[0].BoundBox)+"\n") # BoundBoxFace face coordinates
compteur += 1
texteInfo += (str(compteur)+" : "+"Face BBox Coor")+" : "+str(Gui.Selection.getSelectionEx()[0].SubObjects[0].BoundBox)+"\n"
except:
None
# BoudBox Face Center #11
if BoundBoxFaceC == 1:
try:
det = Gui.Selection.getSelectionEx()[0].SubObjects[0]
App.Console.PrintMessage("Face BoundBox Cent : "+str(Gui.Selection.getSelectionEx()[0].SubObjects[0].BoundBox.Center)+"\n") # BoundBoxFace face center
compteur += 1
texteInfo += (str(compteur)+" : "+"Face BBox Center")+" : X: "+str(det.BoundBox.Center[0])+" Y: "+str(det.BoundBox.Center[1])+" Z: "+str(det.BoundBox.Center[2])+"\n"
except:
None
######Cas d'une forme############################################################
# volume #12
if VolumeObject == 1:
try:
App.Console.PrintMessage("Volume : "+str(sel[0].Shape.Volume)+"\n")
compteur += 1
texteInfo += (str(compteur)+" : "+"Volume")+"\t : "+str(sel[0].Shape.Volume)+"\n"
except:
None
# rectangle du BoundBox #13
if BounboxVolume == 1:
try:
App.Console.PrintMessage("BoundBox Volume : "+str(sel[0].Shape.BoundBox.XLength)+" x "+str(sel[0].Shape.BoundBox.YLength)+" x "+str(sel[0].Shape.BoundBox.ZLength)+"\r\n")
compteur += 1
texteInfo += (str(compteur)+" : "+"BoundBox Volume")+" : "+str(sel[0].Shape.BoundBox.XLength)+" x "+str(sel[0].Shape.BoundBox.YLength)+" x "+str(sel[0].Shape.BoundBox.ZLength)+"\r\n"
except:
None
# boundinbox (dimensions hors tout) #14
if BounboxCoord == 1:
try:
App.Console.PrintMessage("BoundBox Coor : "+str(sel[0].Shape.BoundBox)+"\n")
compteur += 1
texteInfo += (str(compteur)+" : "+"BoundBox Coor")+" : "+str(sel[0].Shape.BoundBox)+"\n"
except:
None
# centre de la forme #15
if BounboxCenter == 1:
try:
det = sel[0].Shape.BoundBox.Center
App.Console.PrintMessage("BoundBox Cent : "+str(det[0])+", "+str(det[1])+", "+str(det[2])+"\n")
compteur += 1
texteInfo += (str(compteur)+" : "+"BoundBox Cent")+" : X: "+str(det[0])+" Y: "+str(det[1])+" Z: "+str(det[2])+"\n"
except:
None
# centre de la masse #16
if CenterMass == 1:
try:
det = sel[0].Shape
c = det.Solids[0].CenterOfMass
App.Console.PrintMessage("CenterMass : X: "+str(c.x)+" Y: "+str(c.y)+" Z: "+str(c.z)+"\n")
compteur += 1
texteInfo += (str(compteur)+" : "+"CenterMass")+"\t : X: "+str(c.x)+" Y: "+str(c.y)+" Z: "+str(c.z)+"\n"
except:
None
# search inclination XY YZ ZX uniquement lignes #17
if LineInclination == 1:
try:
angleX1 = angleY1 = angleZ1 = 0.0
angleX2 = angleY2 = angleZ2 = 0.0
sel = FreeCADGui.Selection.getSelection()
SubElement = FreeCADGui.Selection.getSelectionEx()
element_ = SubElement[0].SubElementNames[0]
if element_[:4] == "Edge":
try:
element_ = element_[4:]
a = sel[0].Shape.Edges[int(element_)-1].Vertexes[0]
angleX1 = a.Point.x
angleY1 = a.Point.y
angleZ1 = a.Point.z
try:
a = sel[0].Shape.Edges[int(element_)-1].Vertexes[1]
angleX2 = a.Point.x
angleY2 = a.Point.y
angleZ2 = a.Point.z
except Exception:
Vertx.append("-")
Vertx.append("-")
Vertx.append("-")
except Exception:
None
try:
Plan_xy = angle2(angleX1,angleY1,angleX2,angleY2,1)
except Exception:
Plan_xy = 0.0
try:
Plan_yz = angle2(angleY1,angleZ1,angleY2,angleZ2,1)
except Exception:
Plan_yz = 0.0
try:
Plan_zx = angle2(angleZ1,angleX1,angleZ2,angleX2,1)
except Exception:
Plan_zx = 0.0
App.Console.PrintMessage("XY: "+str(Plan_xy)+" YZ: "+str(Plan_yz)+" ZX: "+str(Plan_zx)+"\n")
compteur += 1
texteInfo += (str(compteur)+" : "+"Inclination Obj")+"\t : "+"XY: "+str(Plan_xy)+" YZ: "+str(Plan_yz)+" ZX: "+str(Plan_zx)+"\n"
except Exception:
None
# Vertexes de l'objet selectionne #18
if VertexesObject == 1:
try:
a = Gui.Selection.getSelectionEx()[0].SubObjects[0].Vertexes
aa = 0
for a0 in range(len(a)):
aa += 1
App.Console.PrintMessage("Vertexes Obj : X"+str(aa)+": "+str(a[a0].Point.x)+", Y"+str(aa)+ ": "+str(a[a0].Point.y)+", Z"+str(aa)+ ": "+str(a[a0].Point.z)+"\n")
compteur += 1
texteInfo += (str(compteur)+" : "+"Vertexes Obj")+"\t : X"+str(aa)+": "+str(a[a0].Point.x)+", Y"+str(aa)+ ": "+str(a[a0].Point.y)+", Z"+str(aa)+ ": "+str(a[a0].Point.z)+"\n"
except:
None
# Vertexes complet de la forme #19
if VertexesForme == 1:
try:
compt_E = 0
perimetre = 0.0
for j in enumerate(sel[0].Shape.Edges):
compt_E+=1
# perimetre += (sel[0].Shape.Edges[compt_E-1].Length)
a = sel[0].Shape.Edges[compt_E-1].Vertexes[0]
App.Console.PrintMessage("Vertexes Form : "+"X1: "+str(a.Point.x)+" Y1: "+str(a.Point.y)+" Z1: "+str(a.Point.z)+"\n")
compteur += 1
texteInfo +=(str(compteur)+" : "+ "Vertexes Form")+"\t : "+"X1: "+str(a.Point.x)+" Y1: "+str(a.Point.y)+" Z1: "+str(a.Point.z)+"\n"
a = sel[0].Shape.Edges[compt_E-1].Vertexes[1]
App.Console.PrintMessage(" : "+"X2: "+str(a.Point.x)+" Y2: "+str(a.Point.y)+" Z2: "+str(a.Point.z)+"\n")
texteInfo += ("\t\t ")+" : "+"X2: "+str(a.Point.x)+" Y2: "+str(a.Point.y)+" Z2: "+str(a.Point.z)+"\n"
# App.Console.PrintMessage("Perimeter : "+str(perimetre)+"\n")
# compteur += 1
# texteInfo += (str(compteur)+" : "+"Perimeter")+" : "+str(perimetre)+"\n"
except:
None
ff = ui
ff.on_pushButton_Raf_clicked()
App.Console.PrintMessage("End_____________________________________________________________"+"\n")
s=SelObserver()
FreeCADGui.Selection.addObserver(s) # installe la fonction en mode résident
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
Links
Version
Prototype not finished
04/08/2015 Ver 0.02 : add switch and presentation