Macro Dump Objects/it: Difference between revisions

From FreeCAD Documentation
No edit summary
(Created page with "==Opzioni== * l'output può essere diretto verso: ** la vista Report ** una finestra non-modale * si possono elencare i segmenti della geometria di ogni schizzo * si possono e...")
Line 40: Line 40:
[[File:DumpObjectsGui2.jpg]]
[[File:DumpObjectsGui2.jpg]]


==Options==
==Opzioni==
* output may be directed to one of:
* l'output può essere diretto verso:
** the Report view
** la vista Report
**a non-modal window
** una finestra non-modale
* si possono elencare i segmenti della geometria di ogni schizzo
* segments in the Geometry for each Sketch may be listed
* si possono elencare le specifiche di posizionamento degli oggetti
* Placement specifics may be listed for objects


==Remarks==
==Remarks==

Revision as of 18:08, 18 January 2015

File:Macro Dump Objects Macro Dump Objects

Descrizione
Questa macro genera un elenco di tutti gli oggetti del documento corrente. L'elenco può apparire nella finestra dei Rapporti o in una finestra indipendente.

Autore: Piffpoof
Autore
Piffpoof
Download
None
Link
Versione macro
1.0
Data ultima modifica
None
Versioni di FreeCAD
None
Scorciatoia
Nessuna
Vedere anche
Nessuno

Durante lo sviluppo di modelli complessi è facile perdere traccia di quali sono gli oggetti effettivamente presenti dato che alcuni possono essere nascosti, coperti o trasparenti. Inoltre con un gran numero di oggetti diventa necessario conservarne la traccia per gestire il sistema di denominazione.

Descrizione

Il codice Dump Object enumera tutti gli oggetti contenuti nel documento corrente. Quindi genera un rapporto che elenca ogni oggetto, poi una sintesi che fornisce il numero totale di istanze di ogni Classe, seguito dal numero totale di classi e infine il numero totale di oggetti. L'output del rapporto può essere indirizzato alla vista Report o ad una finestra indipendente. La finestra è non-modale e rimane aperta fino a quando non viene chiusa dall'utente. Ogni finestra contiene nella barra del titolo la data e l'ora in cui è stata generata, quindi si può confrontare il contenuto di più finestre, ad esempio, prima e dopo l'esecuzione di una parte di codice.

Di default sono elencati tutti gli oggetti, come opzione si può indicare anche il posizionamento di ogni oggetto. Inoltre, per gli schizzi si può elencare ogni segmento della geometria.

Installazione

Tutto il codice per dumpObject.FCMacro è in una macro. L'installazione consiste nel copiare il suo codice nella appropriata directory delle Macro. Si attiva invocando dumpObject dal menu Macro. In alternativa, può essere eseguita dalla console.

Uso

Selezionare il documento di cui si desidera analizzare gli oggetti per poi avviare la macro in uno di questi modi:

  • dal menu Macro
  • dalla console Python
  • dalla barra degli strumenti

A seconda dei parametri selezionati nella prima finestra, il rapporto viene visualizzato nella vista Report o in una finestra. Le informazioni mostrano tutti gli oggetti del documento corrente. Alcuni dei benefici attesi sono l'individuazione di:

  • irregolarità nei nomi di oggetti, ad esempio errori di ortografia o nomi predefiniti generati da FreeCAD
  • oggetti duplicati
  • oggetti con nomi duplicati (dove FreeCAD ha dovuto creare il secondo nome oggetto unico)
  • oggetti inaspettati
  • posizionamenti inattesi di oggetti (quando è selezionata l'opzione Show Positions)
  • segmenti inattesi nella geometria dello schizzo (quando è selezionata l'opzione Show Sketcher Segments)

Interfaccia utente

La prima finestra è quella che serve per configurare Object Dump:


La seconda finestra è quella che contiene il rapporto sugli oggetti del documento corrente:


Opzioni

  • l'output può essere diretto verso:
    • la vista Report
    • una finestra non-modale
  • si possono elencare i segmenti della geometria di ogni schizzo
  • si possono elencare le specifiche di posizionamento degli oggetti

Remarks

Although tested with many object types in FreeCAD, there probably are some objects that it does not expect, in that case it should list them generically.

Links

none (so far)

Script

#
#			Dump Object
#			v 0.2
#
#***********************************************************************************
# routine to dump object space for Geometric model in the currently active file

from PySide import QtGui, QtCore
from datetime import datetime

# Class definitions

class configureMacro(QtGui.QDialog):
	""""""
	def __init__(self):
		super(configureMacro, self).__init__()
		self.initUI()
	def initUI(self):
		self.result			= None
		# set up display only field for selected path type
		self.cbss			= QtGui.QCheckBox("Show Sketcher Segments?", self)
		self.cbss.move(20,20)
		self.cbp			= QtGui.QCheckBox("Show Positions?", self)
		self.cbp.move(220,20)
		self.pathTypeLbl	= QtGui.QLabel("Select Report Destination:", self)
		self.pathTypeLbl.move(20, 70)
		# cancel button
		cancelButton = QtGui.QPushButton('Cancel', self)
		cancelButton.clicked.connect(self.onCancel)
		cancelButton.move(10, 100)
		# button #1
		button1 = QtGui.QPushButton(choice1, self)
		button1.clicked.connect(self.onBtn1)
		button1.move(120, 100)
		# button #2
		button2 = QtGui.QPushButton(choice2, self)
		button2.clicked.connect(self.onBtn2)
		button2.move(275, 100)
		# define window		xLoc,yLoc,xDim,yDim
		self.setGeometry(	250, 250, 400, 150)
		self.setWindowTitle("Select a Report Destination")
		self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
		self.show()
	def onCancel(self):
		self.result = "cancelled"
		self.close()
	def onBtn1(self):
		self.result = choice1
		self.close()
	def onBtn2(self):
		self.result = choice2
		self.close()

class DisplayText(QtGui.QWidget):
#class DisplayText(QtGui.QMainWindow):
	""""""
	def __init__(self, textToDisplay):
		self.text = textToDisplay
		super(DisplayText, self).__init__()
		self.initUI(textToDisplay)
	def initUI(self, textToDisplay):
		"""Constructor"""
		self.textToDisplay = textToDisplay
		# some window dimensions
		self.windowHome = screenWidth * 0.05
		self.windowWidth = screenWidth * 0.9
		self.windowHeight = 400
		self.fieldMargin = 40
		# some column titles
		columnLabels = QtGui.QLabel(formatPrintLine("Type / WB","Shape","User Supplied Label","Name"))
		columnLabels.setFont('Courier')
		# set up text editing widget
		text_editor = QtGui.QTextEdit(self)
		text_editor.setFont('Courier')
		text_editor.setLineWrapMode(QtGui.QTextEdit.NoWrap)
		text_editor.move(self.fieldMargin,self.fieldMargin)
		text_editor.move(0,self.fieldMargin)
		text_editor.resize(self.windowWidth-(2*self.fieldMargin),self.windowHeight-(2*self.fieldMargin))
		text_editor.resize(self.windowWidth,self.windowHeight-(2*self.fieldMargin))
		text_editor.append(self.textToDisplay)
		# set up the layout
		vBox = QtGui.QVBoxLayout()
		vBox.addWidget(columnLabels)
		vBox.addWidget(text_editor)
		self.setLayout(vBox)
		# define window		xLoc,yLoc,xDim,yDim
		self.setGeometry(	self.windowHome, self.windowHome, self.windowWidth, self.windowHeight)
		self.setWindowTitle("Object Dump of '" + FreeCADGui.ActiveDocument.Document.Label + "' at " + str(datetime.now()))
		self.show()
	#----------------------------------------------------------------------
	def onOk(self):
		self.close()

# define functions

def countObjects():
	printList = list()
	objectTypeTable = {}
	# build up dictionary of different classes and keep a count
	for obj in FreeCAD.ActiveDocument.Objects:
		if objectTypeTable.has_key(obj.TypeId):
			objectTypeTable[obj.TypeId] = objectTypeTable[obj.TypeId]+1
		else:
			objectTypeTable[obj.TypeId] = 1
		wb = obj.TypeId[0:obj.TypeId.find("::")]
		shape = obj.TypeId[obj.TypeId.find("::")+2:]
		placementString = ""
		if obj.TypeId == "Sketcher::SketchObject":
			printList.append(formatPrintLine("Sketch", "", str(obj.Label)))
			if showSketcherSegmentsFlag:
				for i in obj.Geometry:
					printList.append(formatPrintLine("", " -segment", str(i)))
		elif wb == "Part":
			if showPlacementFlag:
				placementString = str(obj.Placement)
			if shape in ("Cylinder", "Cut", "Box", "Fuse", "Loft", "Feature", "Part2DObjectPython"):
				printList.append(formatPrintLine(wb, shape, str(obj.Label), str(obj.Name)))
			elif obj.TypeId == "Part::Feature":
				printList.append(formatPrintLine(str(obj.TypeId), "", str(obj.Label), str(obj.Name)))
			elif obj.TypeId == "Part::Part2DObjectPython":
				printList.append(formatPrintLine(str(obj.TypeId), "", str(obj.Label), str(obj.Name)))
		elif wb == "PartDesign":
			if showPlacementFlag:
				placementString = str(obj.Placement)
			if shape in ("Pad", "Fillet"):
				printList.append(formatPrintLine(wb, shape, str(obj.Label), str(obj.Name)))
			elif obj.TypeId == "Part::Feature":
				printList.append(formatPrintLine(str(obj.TypeId), "", str(obj.Label), str(obj.Name)))
			elif obj.TypeId == "Part::Part2DObjectPython":
				printList.append(formatPrintLine(str(obj.TypeId), "", str(obj.Label), str(obj.Name)))
		elif obj.TypeId == "App::DocumentObjectGroup":
			printList.append(formatPrintLine("Group", "", str(obj.Label)))
		elif obj.TypeId == "Image::ImagePlane":
			printList.append(formatPrintLine(wb, shape, str(obj.Label), str(obj.Name)))		
		else:
			printList.append(formatPrintLine(str(obj.TypeId), str(obj.Label), str(obj.Name)))
		if showPlacementFlag and len(placementString)!=0:
			printList.append(formatPrintLineMax("", " -placement", placementString))

	printList.append("")
	printList.append("=======================================================")
	from collections import OrderedDict
	sortedByTags = OrderedDict(sorted(objectTypeTable.items(), key=lambda x: x[1], reverse=True))
	for k, v in sortedByTags.items():
		printList.append(formatPrintLineSum(k,v))
	printList.append("")
	objectClassCount = 0; objectTotalCount = 0
	for i in objectTypeTable:
		objectTotalCount = objectTotalCount + objectTypeTable[i]
	objectCLassCount = len(objectTypeTable)
	printList.append(formatPrintLineSum("Object Class Total is ", str(objectCLassCount)))
	printList.append(formatPrintLineSum("Object Total is ", str(objectTotalCount)))
	printList.append("=======================================================")
	return printList

def formatPrintLineSum(a,b):
	return printLineFormatter(2, a, str(b), "", "")

def formatPrintLineMax(a,b,c):
	return printLineFormatter(1, a, b, "", "")

def formatPrintLine(a,b,c, *args):
	d = ""
	if len(args)==1:
		d = args[0]
	return printLineFormatter(0, a, b, c, d)

def printLineFormatter(flag,a,b,c,d):
	# flag = 0	standard print, spread values over 4 columns
	# flag = 1	printing verbose things like Sketch details or Placements, combine columns 3 & 4
	# flag = 2	printing the summary lines, combine columns 1 & 2
	if flag==0:
		aa = a[:f1]
		bb = b[:f2]
		cc = c[:f3]
		dd = d[:f4]
		return printFormatString4.format(aa,bb,cc,dd)
	elif flag==1:
		aa = a[:f1]
		bb = b[:f2]
		cc = c[:f3+f4]
		dd = d[:f4]
		return printFormatString3.format(aa,bb,cc)
	else:
		aa = a[:f1+f2]
		bb = b[:f3+f4]
		return printFormatString2.format(aa,bb)

# constants
# set some field widths
screenWidth = QtGui.QDesktopWidget().screenGeometry().width()
global f1, f2, f3, f4
# f1 = 15; f2 = 25; f3 = 45; f4 = 25 # 110 columns in 1000 pixels
f1 = 15*screenWidth/1000; f2 = 25*screenWidth/1000; f3 = 45*screenWidth/1000; f4 = 25*screenWidth/1000
# and some print format strings
global printFormatString2, printFormatString3, printFormatString4
printFormatString2 = "{0:<"+str(f1+f2)+"} {1:<"+str(f3)+"}"
printFormatString3 = "{0:<"+str(f1)+"} {1:<"+str(f2)+"} {2:<"+str(f3+f4)+"}"
printFormatString4 = "{0:<"+str(f1)+"} {1:<"+str(f2)+"} {2:<"+str(f3)+"} {3:<"+str(f4)+"}"
# some button labels that are check in the code
global choice1, choice2
choice1 = "Report View"; choice2 = "Window"

# code ***********************************************************************************
if FreeCAD.ActiveDocument != None:
	# ask if to window or to Report View...
	form = configureMacro()
	form.exec_()
	showSketcherSegmentsFlag = False
	if form.cbss.isChecked():
		showSketcherSegmentsFlag = True
	showPlacementFlag = False
	if form.cbp.isChecked():
		showPlacementFlag = True
	printList = countObjects()
	if form.result == choice1: # report to Report View
		print printFormatString4.format(	"", "", "(User Supplied)", "")
		print printFormatString4.format(	"Type", "Shape", "Label", "Name")
		print ""
		for line in printList:
			print line + "\n"
	if form.result == choice2: # report to window
		#----------------------------------------------------------------------
		longPrintLine = ""
		for line in printList:
			longPrintLine = longPrintLine + line + "\n"
		form = DisplayText(longPrintLine)
#
#OS: Mac OS X
#Word size: 64-bit
#Version: 0.14.3703 (Git)
#Branch: releases/FreeCAD-0-14
#Hash: c6edd47334a3e6f209e493773093db2b9b4f0e40
#Python version: 2.7.5
#Qt version: 4.8.6
#Coin version: 3.1.3
#SoQt version: 1.5.0
#OCC version: 6.7.0
#
Other languages: