Función para calcular volumen de objetos

Este foro es para preguntas y debates en Español
Forum rules
reglas del foro e información útil

IMPORTANTE: Por favor leer antes de solicitar ayuda
User avatar
dcapeletti
Posts: 504
Joined: Wed Jul 23, 2014 2:27 pm

Función para calcular volumen de objetos

Post by dcapeletti »

Estimados,
estoy intentando sacar manualmente el volumen de esta tolva pero sería interesante que FreeCAD tenga dicha funcionalidad. ¿Alguien sabe dónde está si es que la tiene o si se podría considerar para el desarrollo? :)

OS: Trisquel GNU/Linux 7.0, Belenos
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.16.6712 (Git)
Build type: None
Branch: releases/FreeCAD-0-16
Hash: da2d364457257a7a8c6fb2137cea12c45becd71a
Python version: 2.7.6
Qt version: 4.8.6
Coin version: 4.0.0a
OCC version: 6.8.0.oce-0.17

Muchas gracias.
Attachments
Tolva.png
Tolva.png (15.76 KiB) Viewed 4212 times
Joyas
Posts: 532
Joined: Sat Jul 12, 2014 8:39 pm

Re: Función para calcular volumen de objetos

Post by Joyas »

Si es un objeto sólido, si puedes calcularlo mediante Phyton o mediante una hoja de cálculo (importante: no uses valores de entrada y salida en una misma hoja de cálculo, usa dos separadas), hay una función que no recuerdo ahora, pero salía con autocompletar, no se si era nombre_objeto.shape.volume o algo similar.

Si es uno hueco puedes cerrarlo con el módulo Part y hacer el cálculo igualmente.
Estudié ingeniería técnica industrial en España y sólo me ha servido para estar en el paro, no me contratan porque no tengo experiencia, y no tengo experiencia porque no me contratan. No debí estudiar esa carrera.
User avatar
dcapeletti
Posts: 504
Joined: Wed Jul 23, 2014 2:27 pm

Re: Función para calcular volumen de objetos

Post by dcapeletti »

Estimado, muchas gracias por la información.

He probado cerrar el cuerpo y crear un sólido. El resultado de me devuelve App.ActiveDocument.getObject("Compound001").Shape.Volume es el siguiente:
2895244999.999999
Pero si hago uso de la formula de pirámide truncada para calcular el volumen V = (H/3) * ((L*l) + L² + l²) el resultado es:
4432000 cm³

Pero si hago el cálculo con un cubo primitivo si que calcula bien.

¿Por qué hay tal diferencia? ¿Hay algo que echo mal? :?:

Gracias
mario52
Veteran
Posts: 4698
Joined: Wed May 16, 2012 2:13 pm

Re: Función para calcular volumen de objetos

Post by mario52 »

saluto

good 4432000.0 cm³

PyramideTronquee.FCStd
(13.73 KiB) Downloaded 106 times

Code: Select all

sel = FreeCADGui.Selection.getSelection()                                 # select object with getSelection()
volume_ = sel[0].Shape.Volume                                             # Volume of the object
App.Console.PrintMessage("volume_        : "+str(volume_)+"\n\n")
or my macro Macro_FCInfo
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
User avatar
dcapeletti
Posts: 504
Joined: Wed Jul 23, 2014 2:27 pm

Re: Función para calcular volumen de objetos

Post by dcapeletti »

Muchas gracias, ha funcionado!!! :)
Me parece un módulo muy interesante para nivel usuario. Lo voy a instalar. De nuevo, muchísimas gracias.

Saludos
User avatar
dcapeletti
Posts: 504
Joined: Wed Jul 23, 2014 2:27 pm

Re: Función para calcular volumen de objetos

Post by dcapeletti »

Estimado,
he instalado esta versión https://gist.github.com/mario52a/8d40ab6c018c2bde678f de FCInfo. Pero los botones Salir, Guardar no se muestran en el cuadro de díalogo de la macro. ¿Cuál puede ser su causa?. Adjunto imagen.

Saludos
Attachments
FCInfo.png
FCInfo.png (160.6 KiB) Viewed 4143 times
mario52
Veteran
Posts: 4698
Joined: Wed May 16, 2012 2:13 pm

Re: Función para calcular volumen de objetos

Post by mario52 »

saluto
por favor, ¿cuál es la definición de su pantalla?
tal vez su pantalla es demasiado pequeña o la ventana FreeCAD es pequeña demasiadas barras de herramientas ?
también puede desmontar la macro ver aquí
(tal vez igual aquí)
(google translate)

please what is the definition of your screen ?
maybe your screen is too small or the FreeCAD window is small or many tool bar ?
you can also detach the macro see here
(maybe same here)
(google translate)

FCInfo_UnDock.gif
FCInfo_UnDock.gif (101.78 KiB) Viewed 4129 times
mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
User avatar
dcapeletti
Posts: 504
Joined: Wed Jul 23, 2014 2:27 pm

Re: Función para calcular volumen de objetos

Post by dcapeletti »

Gracias por la respuesta. Resolución 1366x768. Incluso si lo muevo no puedo ver los botones.

Estuve viendo el código fuente de su macro. Todos los objetos, Label y LineEdit se dibujan usando posición absoluta (QtCore.QRect(10, 10, 111, 16)) sobre el contenedor windows o scrollAreaWidgetContents_2. Esto es un gran trabajo y lo hace poco eficiente.
En lugar de eso, se podría usar paneles y Layouts verticales u horizontales para distribuir los objetos en pantalla y se olvida de su posición. Estos objetos hacen que los controles se adapten automáticamente a la resolución que tiene la pantalla del usuario, por ende, se puede olvidar de dichos problemas. Incluso si cambia el tamaño de la ventana, los layouts se recalculan automáticamente para dibujar los controles.

http://zetcode.com/gui/pysidetutorial/layoutmanagement/
https://srinikom.github.io/pyside-docs/ ... ayout.html
https://srinikom.github.io/pyside-docs/ ... ayout.html
https://srinikom.github.io/pyside-docs/ ... ayout.html

Con su permiso, intentaré jugar con los Layouts y vuelvo a comentar. :)

Sds
Last edited by dcapeletti on Tue Sep 19, 2017 12:38 am, edited 1 time in total.
User avatar
dcapeletti
Posts: 504
Joined: Wed Jul 23, 2014 2:27 pm

Re: Función para calcular volumen de objetos

Post by dcapeletti »

Aquí he probado con éxito Layouts verticales y horizontales. Puede ver, como simplemente añadiendo uno con otros, se acomodan automáticamente. :) Con algo mas de tiempo, podría reescribir toda la GUI del macro.
Los botones bajo layouts verticales se alinean uno debajo del otro, ocupando todo el ancho del contenedor padre. Pero es posible establecer un tamaño mas pequeño si lo desea.
Los Label y QLineEdit los organizo horizontalmente. Como puede ver, adaptan automáticamente su tamaño de acuerdo al tamaño de ambos ocupando todo el ancho del contenedor padre. Pero es posible establecer un ancho o alto distinto de cada control si lo desea.

Code: Select all

import PySide                                       # PySide
from PySide import QtGui ,QtCore                    # PySide
from PySide.QtGui import QComboBox                  # PySide
from PySide.QtGui import QMessageBox                # PySide
from PySide.QtGui import QTableWidget, QApplication # PySide
from PySide.QtGui import *                          # PySide
from PySide.QtCore import *                         # PySide

import Draft, Part, FreeCAD, math, PartGui, FreeCADGui
import Part
from math import sqrt, pi, sin, cos, asin, degrees, radians, tan
from FreeCAD import Base

import csv

class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        self.window = MainWindow
        #MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(370, 635)
        MainWindow.setMaximumSize(QtCore.QSize(370, 635))

        self.fontGlobal_08 = QtGui.QFont()            # pour compatibilite Windows Linux pour tous les textes
        self.fontGlobal_08.setFamily("Arial")         # pour compatibilite Windows Linux pour tous les textes
        self.fontGlobal_08.setPointSize(8.0)          # pour compatibilite Windows Linux pour tous les textes

        self.centralWidget = QtGui.QWidget(MainWindow)
	self.button1 =  QPushButton("One", self.centralWidget)
	self.button2 =  QPushButton("Two", self.centralWidget)
	self.button3 =  QPushButton("Three", self.centralWidget)
	self.button4 =  QPushButton("Four", self.centralWidget)
	self.button5 =  QPushButton("Five", self.centralWidget)
	
	self.layout =  QVBoxLayout() #Layout vertical
	
	self.layout.addWidget(self.button1)
	self.layout.addWidget(self.button2)
	self.layout.addWidget(self.button3)
	self.layout.addWidget(self.button4)
	self.layout.addWidget(self.button5)

	self.label_1 = QtGui.QLabel(self.centralWidget)
	self.label_1.setText("Document name")	
	self.label_2 = QtGui.QLabel(self.centralWidget)
	self.label_2.setText("Date")	
	self.lineEdit_1 = QtGui.QLineEdit(self.centralWidget)
	self.lineEdit_2 = QtGui.QLineEdit(self.centralWidget)

	self.layout2 = QHBoxLayout() #Layout horizontal
	self.layout2.addWidget(self.label_1)
	self.layout2.addWidget(self.lineEdit_1)
	self.layout.addLayout(self.layout2)  #I add one layout into another.

	self.layout3 = QHBoxLayout() #Layout horizontal
	self.layout3.addWidget(self.label_2)
	self.layout3.addWidget(self.lineEdit_2)
	self.layout.addLayout(self.layout3)  #I add one layout into another.
		
	self.centralWidget.setLayout(self.layout)
	#self.window.setLayout(self.layout)
	self.centralWidget.setGeometry(0, 0, 200, 200)


#########################################################################################################################
class SelObserver:
    def addSelection(self,document, object, element, position):  # Selection
        global ui
        global sel
        global document_
        global object_Label
        global element_
        global position0
        global position1
        global position2

        sel = FreeCADGui.Selection.getSelection()   

        document_    = document
        object_Label = object
        element_     = element

        position0 = position[0]
        position1 = position[1]
        position2 = position[2]
        
        if len(sel)==0:
            App.Console.PrintMessage("Select an object"+"\n")
            errorDialog("Select an object")
        else:
            ff = myNewFreeCADWidget.ui
            ff.on_pushButton_Raf_clicked()
        #####################################################################################


sel = FreeCADGui.Selection.getSelection()   

s=SelObserver()
FreeCADGui.Selection.addObserver(s)               # install the function resident mode

myNewFreeCADWidget = QtGui.QDockWidget()          # create a new dckwidget
myNewFreeCADWidget.ui = Ui_MainWindow()           # myWidget_Ui()             # load the Ui script
myNewFreeCADWidget.ui.setupUi(myNewFreeCADWidget) # setup the ui

FCmw = FreeCADGui.getMainWindow()                 # PySide # the active qt window, = the freecad window since we are inside it 
FCmw.addDockWidget(QtCore.Qt.RightDockWidgetArea,myNewFreeCADWidget) # add the widget to the main window Right
Attachments
Example Layouts.png
Example Layouts.png (119.81 KiB) Viewed 4099 times
mario52
Veteran
Posts: 4698
Joined: Wed May 16, 2012 2:13 pm

Re: Función para calcular volumen de objetos

Post by mario52 »

Saluto
dcapeletti wrote: Mon Sep 18, 2017 10:46 pm Gracias por la respuesta. Resolución 1366x768. Incluso si lo muevo no puedo ver los botones.
Sospeché (je m'en doutais)
dcapeletti wrote: Tue Sep 19, 2017 12:32 am Aquí he probado con éxito Layouts verticales y horizontales. Puede ver, como simplemente añadiendo uno con otros, se acomodan automáticamente. :) Con algo mas de tiempo, podría reescribir toda la GUI del macro.
Los botones bajo layouts verticales se alinean uno debajo del otro, ocupando todo el ancho del contenedor padre. Pero es posible establecer un tamaño mas pequeño si lo desea.
Los Label y QLineEdit los organizo horizontalmente. Como puede ver, adaptan automáticamente su tamaño de acuerdo al tamaño de ambos ocupando todo el ancho del contenedor padre. Pero es posible establecer un ancho o alto distinto de cada control si lo desea.
muchas gracias, estoy interesado pero manteniendo la presentación
si entiendo el sistema lo haré yo mismo y también estoy interesado en esta macro Macro_FCTreeView
(translate by google)

mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting.
My macros on Gist.github here complete macros Wiki and forum.
Post Reply