Macro Select Hovering

From FreeCAD Documentation
Revision as of 17:51, 24 January 2018 by Renatorivo (talk | contribs)

File:Macro Select Hovering Macro Select Hovering

Description
This macro select a choice Face, Edge, Vertex hovering by the mouse.

Macro version: 00.03
Last modified: 2017-12-26
Author: Mario52
Author
Mario52
Download
None
Links
Macro Version
00.03
Date last modified
2017-12-26
FreeCAD Version(s)
None
Default shortcut
None
See also
None

Macro Select Hovering

Description

this macro select a choice Face, Edge, Vertex hovering by the mouse.

PS: For unselected one face (or other) click the Pause grab and use the standard procedure : CTRL + Click

How To Use

Hovering element by the mouse.

Icons

The icon must be copied into the same directory as the macro

Script

The icon ToolBar Macro Select Hovering

Macro Select Hovering.FCMacro

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
#
"""
***************************************************************************
*   Copyright (c) 2017 <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                   *
***************************************************************************
"""
#
#Macro_ _01-25/12/2017 02-26/12/2017 03-26/12/2017
#
#OS: Windows 10
#Word size of OS: 64-bit
#Word size of FreeCAD: 64-bit
#Version: 0.16.6712 (Git)
#Build type: Release
#Branch: releases/FreeCAD-0-16
#Hash: da2d364457257a7a8c6fb2137cea12c45becd71a
#Python version: 2.7.8
#Qt version: 4.8.7
#Coin version: 4.0.0a
#OCC version: 6.8.0.oce-0.17
#
__title__   = "Macro_Select_Hovering"
__author__  = "Mario52"
__url__     = "http://www.freecadweb.org/index-fr.html"
__Wiki__    = "http://www.freecadweb.org/wiki/index.php?title=Macro_Select_Hovering"
__version__ = "00.03"
__date__    = "26/12/2017"

import PySide
from PySide import QtGui ,QtCore
from PySide.QtGui import *
from PySide.QtCore import *
 
import Draft, Part, PartGui, FreeCADGui, FreeCAD

Gui = FreeCADGui
App = FreeCAD

global ui         ; ui           = ""
global s          ; s            = ""

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)

class Ui_MainWindow(object):

    def __init__(self, MainWindow):
        self.window = MainWindow
        #################################################################################
        #self.path  = FreeCAD.ConfigGet("AppHomePath")
        #self.path  = FreeCAD.ConfigGet("UserAppData")
        #self.path  = "your path"
        param = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro")# macro path
        self.path = param.GetString("MacroPath","") + "/"                   # macro path
        self.path = self.path.replace("\\","/")
#        print "Path for the icons : " , self.path
        #################################################################################
        self.FontImpost    = "Arial"
        self.fontGlobal_08 = QtGui.QFont()            # pour compatibilite Windows Linux
        self.fontGlobal_08.setFamily(self.FontImpost) # pour compatibilite Windows Linux
        self.fontGlobal_08.setPointSize(8.0)          # pour compatibilite Windows Linux
        #self.xxxx.setFont(self.fontGlobal_08)        # pour W L
        #self.xxxx.setFont(QtGui.QFont(self.FontImpost,weight=QtGui.QFont.Bold))  # Bold
        #################################################################################

        self.comptFace         = 0
        self.comptEdge         = 0
        self.comptVertex       = 0
        self.Stop_Grab         = 1
        self.comptSurfaceFace  = 0.0
        self.comptSurfaceTotal = 0.0
        self.comptLengthObject = 0.0
        self.comptLengthTotal  = 0.0

    def setupUi(self, MainWindow):
        MainWindow.resize(197, 307)
        MainWindow.setMinimumSize(QtCore.QSize(197, 307))
        MainWindow.setMaximumSize(QtCore.QSize(197, 307))
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))

        self.GBOX_01_Face = QtGui.QGroupBox(self.centralwidget)
        self.GBOX_01_Face.setGeometry(QtCore.QRect(10, 10, 176, 91))
        self.GBOX_01_Face.setFont(self.fontGlobal_08)         # pour W L
        self.GBOX_01_Face.setObjectName(_fromUtf8("GBOX_01_Face"))

        self.LE_02_Area_Object = QtGui.QLineEdit(self.GBOX_01_Face)
        self.LE_02_Area_Object.setGeometry(QtCore.QRect(90, 60, 75, 20))
        self.LE_02_Area_Object.setFont(self.fontGlobal_08)    # pour W L
        self.LE_02_Area_Object.setObjectName(_fromUtf8("LE_02_Area_Object"))

        self.LAB_05_Area_Object = QtGui.QLabel(self.GBOX_01_Face)
        self.LAB_05_Area_Object.setGeometry(QtCore.QRect(90, 40, 71, 16))
        self.LAB_05_Area_Object.setFont(self.fontGlobal_08)   # pour W L
        self.LAB_05_Area_Object.setObjectName(_fromUtf8("LAB_05_Area_Object"))

        self.CB_01_Sel_Face = QtGui.QCheckBox(self.GBOX_01_Face)
        self.CB_01_Sel_Face.setGeometry(QtCore.QRect(10, 20, 91, 17))
        self.CB_01_Sel_Face.setFont(self.fontGlobal_08)       # pour W L
        self.CB_01_Sel_Face.setObjectName(_fromUtf8("CB_01_Sel_Face"))

        self.LE_01_Area_Total = QtGui.QLineEdit(self.GBOX_01_Face)
        self.LE_01_Area_Total.setGeometry(QtCore.QRect(10, 60, 75, 20))
        self.LE_01_Area_Total.setFont(self.fontGlobal_08)     # pour W L
        self.LE_01_Area_Total.setObjectName(_fromUtf8("LE_01_Area_Total"))

        self.LAB_01_Face = QtGui.QLabel(self.GBOX_01_Face)
        self.LAB_01_Face.setGeometry(QtCore.QRect(110, 23, 56, 16))
        self.LAB_01_Face.setFont(self.fontGlobal_08)          # pour W L
        self.LAB_01_Face.setObjectName(_fromUtf8("LAB_01_Face"))

        self.LAB_04_Area_Total = QtGui.QLabel(self.GBOX_01_Face)
        self.LAB_04_Area_Total.setGeometry(QtCore.QRect(10, 40, 56, 16))
        self.LAB_04_Area_Total.setFont(self.fontGlobal_08)    # pour W L
        self.LAB_04_Area_Total.setObjectName(_fromUtf8("LAB_04_Area_Total"))


        self.GBOX_02_Edge = QtGui.QGroupBox(self.centralwidget)
        self.GBOX_02_Edge.setGeometry(QtCore.QRect(10, 105, 176, 91))
        self.GBOX_02_Edge.setFont(self.fontGlobal_08)         # pour W L
        self.GBOX_02_Edge.setObjectName(_fromUtf8("GBOX_02_Edge"))

        self.LAB_02_Edge = QtGui.QLabel(self.GBOX_02_Edge)
        self.LAB_02_Edge.setGeometry(QtCore.QRect(110, 25, 56, 16))
        self.LAB_02_Edge.setFont(self.fontGlobal_08)          # pour W L
        self.LAB_02_Edge.setObjectName(_fromUtf8("LAB_02_Edge"))

        self.CB_02_Sel_Edge = QtGui.QCheckBox(self.GBOX_02_Edge)
        self.CB_02_Sel_Edge.setGeometry(QtCore.QRect(10, 20, 91, 17))
        self.CB_02_Sel_Edge.setFont(self.fontGlobal_08)       # pour W L
        self.CB_02_Sel_Edge.setObjectName(_fromUtf8("CB_02_Sel_Edge"))

        self.LE_03_Length_Total = QtGui.QLineEdit(self.GBOX_02_Edge)
        self.LE_03_Length_Total.setGeometry(QtCore.QRect(10, 60, 75, 20))
        self.LE_03_Length_Total.setFont(self.fontGlobal_08)   # pour W L
        self.LE_03_Length_Total.setObjectName(_fromUtf8("LE_03_Length_Total"))

        self.LE_04_Length_Object = QtGui.QLineEdit(self.GBOX_02_Edge)
        self.LE_04_Length_Object.setGeometry(QtCore.QRect(90, 60, 75, 20))
        self.LE_04_Length_Object.setFont(self.fontGlobal_08)  # pour W L
        self.LE_04_Length_Object.setObjectName(_fromUtf8("LE_04_Length_Object"))

        self.LAB_06_Length_Total = QtGui.QLabel(self.GBOX_02_Edge)
        self.LAB_06_Length_Total.setGeometry(QtCore.QRect(10, 40, 71, 16))
        self.LAB_06_Length_Total.setFont(self.fontGlobal_08)  # pour W L
        self.LAB_06_Length_Total.setObjectName(_fromUtf8("LAB_06_Length_Total"))

        self.LAB_07_Length_Obgect = QtGui.QLabel(self.GBOX_02_Edge)
        self.LAB_07_Length_Obgect.setGeometry(QtCore.QRect(90, 40, 71, 16))
        self.LAB_07_Length_Obgect.setFont(self.fontGlobal_08) # pour W L
        self.LAB_07_Length_Obgect.setObjectName(_fromUtf8("LAB_07_Length_Obgect"))


        self.GBOX_03_Vertex = QtGui.QGroupBox(self.centralwidget)
        self.GBOX_03_Vertex.setGeometry(QtCore.QRect(10, 200, 176, 46))
        self.GBOX_03_Vertex.setFont(self.fontGlobal_08)       # pour W L
        self.GBOX_03_Vertex.setObjectName(_fromUtf8("GBOX_03_Vertex"))

        self.LAB_03_Vertex = QtGui.QLabel(self.GBOX_03_Vertex)
        self.LAB_03_Vertex.setGeometry(QtCore.QRect(110, 25, 56, 16))
        self.LAB_03_Vertex.setFont(self.fontGlobal_08)        # pour W L
        self.LAB_03_Vertex.setObjectName(_fromUtf8("LAB_03_Vertex"))

        self.CB_03_Sel_Vertex = QtGui.QCheckBox(self.GBOX_03_Vertex)
        self.CB_03_Sel_Vertex.setGeometry(QtCore.QRect(10, 22, 91, 17))
        self.CB_03_Sel_Vertex.setFont(self.fontGlobal_08)     # pour W L
        self.CB_03_Sel_Vertex.setObjectName(_fromUtf8("CB_03_Sel_Vertex"))


        self.GBOX_04_Main = QtGui.QGroupBox(self.centralwidget)
        self.GBOX_04_Main.setGeometry(QtCore.QRect(10, 250, 176, 51))
        self.GBOX_04_Main.setFont(self.fontGlobal_08)         # pour W L
        self.GBOX_04_Main.setObjectName(_fromUtf8("GBOX_04_Main"))

        self.PB_02_Stop_Grab = QtGui.QPushButton(self.GBOX_04_Main)
        self.PB_02_Stop_Grab.setGeometry(QtCore.QRect(90, 20, 75, 23))
        self.PB_02_Stop_Grab.setFont(self.fontGlobal_08)      # pour W L
        self.PB_02_Stop_Grab.setObjectName(_fromUtf8("PB_02_Stop_Grab"))
        self.PB_02_Stop_Grab.clicked.connect(self.on_PB_02_Stop_Grab_clicked)

        self.PB_01_Quit = QtGui.QPushButton(self.GBOX_04_Main)
        self.PB_01_Quit.setGeometry(QtCore.QRect(5, 20, 75, 23))
        self.PB_01_Quit.setFont(self.fontGlobal_08)           # pour W L
        self.PB_01_Quit.setObjectName(_fromUtf8("PB_01_Quit"))
        self.PB_01_Quit.clicked.connect(self.on_PB_Quit_clicked)

        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle("Select_Hovering")
        MainWindow.setWindowIcon(QtGui.QIcon(self.path + __title__ +".png"))#
        self.GBOX_01_Face.setTitle("Face")
        self.CB_01_Sel_Face.setText("Select Face")
        self.LAB_01_Face.setText("0")
        self.LAB_04_Area_Total.setText("Area Total")
        self.LAB_05_Area_Object.setText("Area Object")

        self.GBOX_02_Edge.setTitle("Edge")
        self.CB_02_Sel_Edge.setText("Select Edge")
        self.LAB_02_Edge.setText("0")
        self.LAB_06_Length_Total.setText("Length Total")
        self.LAB_07_Length_Obgect.setText("Length Object")

        self.GBOX_03_Vertex.setTitle("Vertex")
        self.CB_03_Sel_Vertex.setText("Select Vertex")
        self.LAB_03_Vertex.setText("0")

        self.GBOX_04_Main.setTitle("Main")
        self.PB_01_Quit.setText("Quit")
        self.PB_02_Stop_Grab.setText("Pause grab")

        MainWindow.setWindowFlags(PySide.QtCore.Qt.WindowStaysOnTopHint)       # PySide cette fonction met la fenetre en avant


    def on_PB_02_Stop_Grab_clicked(self):
        global s

        if self.Stop_Grab == 1:
            FreeCADGui.Selection.removeObserver(s)                             # desinstalle la fonction residente SelObserver
            self.Stop_Grab = 0
            self.PB_02_Stop_Grab.setText("Active grab")
            print "Grab pause"
        else:
            s=SelObserver()
            FreeCADGui.Selection.addObserver(s)                                # installe la fonction en mode resident
            self.Stop_Grab = 1
            self.PB_02_Stop_Grab.setText("Pause grab")
            print "Grab active"

    def on_PB_Quit_clicked(self):
        global s

        FreeCADGui.Selection.removeObserver(s)                              # desinstalle la fonction residente SelObserver
        self.window.hide()                                                  # hide the window and close the macro
        print "Quit ",__title__

##################################################################################################
class SelObserver:
    global ui

    def setPreselection(self,doc,obj,sub): # preselection
        global ui

        if ui.CB_01_Sel_Face.isChecked():

            if (sub[:4] == "Face") and (Gui.Selection.isSelected (FreeCAD.ActiveDocument.getObject(obj), sub) == False):
                Gui.Selection.addSelection(FreeCAD.ActiveDocument.getObject(obj), sub)
                ui.comptFace += 1
                ui.LAB_01_Face.setText(str(ui.comptFace))

                ui.comptSurfaceFace = FreeCAD.ActiveDocument.getObject(obj).Shape.Faces[int(sub[4:])-1].Area
                ui.comptSurfaceTotal += ui.comptSurfaceFace
                ui.LE_01_Area_Total.setText(str(ui.comptSurfaceTotal))
                ui.LE_02_Area_Object.setText(str(ui.comptSurfaceFace))


        if ui.CB_02_Sel_Edge.isChecked():

            if (sub[:4] == "Edge") and (Gui.Selection.isSelected (FreeCAD.ActiveDocument.getObject(obj), sub) == False):
                objetSelect = Gui.Selection.addSelection(FreeCAD.ActiveDocument.getObject(obj), sub)

                ui.comptEdge += 1
                ui.LAB_02_Edge.setText(str(ui.comptEdge))

                ui.comptLengthObject = FreeCAD.ActiveDocument.getObject(obj).Shape.Edges[int(sub[4:])-1].Length
                ui.comptLengthTotal += ui.comptLengthObject
                ui.LE_03_Length_Total.setText(str(ui.comptLengthTotal))
                ui.LE_04_Length_Object.setText(str(ui.comptLengthObject))


        if ui.CB_03_Sel_Vertex.isChecked():

            if sub[:6] == "Vertex" and (Gui.Selection.isSelected (FreeCAD.ActiveDocument.getObject(obj), sub) == False):
                Gui.Selection.addSelection(FreeCAD.ActiveDocument.getObject(obj), sub)
                ui.comptVertex += 1
                ui.LAB_03_Vertex.setText(str(ui.comptVertex))


#    def removePreselection(self,doc,obj,sub) # 
#        print "removePreselection"
#    def addSelection(self,doc,obj,sub,pnt):  # Selection
#        print "addSelection"
#    def removeSelection(self,doc,obj,sub):   # Effacer l'objet selectionne
#        print "removeSelection"
#    def setSelection(self,doc):              # Selection dans ComboView
#        FreeCADGui.Selection.removeObserver(s)
#        print "setSelection quit"

    def clearSelection(self,doc):            # Si clic sur l'ecran, effacer la selection
        global ui

        ui.comptFace   = 0
        ui.comptEdge   = 0
        ui.comptVertex = 0
        ui.comptSurfaceFace  = 0.0
        ui.comptSurfaceTotal = 0.0
        ui.comptLengthObject = 0.0
        ui.comptLengthTotal  = 0.0
        ui.LAB_01_Face.setText(str(ui.comptFace))
        ui.LAB_02_Edge.setText(str(ui.comptEdge))
        ui.LAB_03_Vertex.setText(str(ui.comptVertex))
        ui.LE_01_Area_Total.setText(str(ui.comptSurfaceTotal))
        ui.LE_02_Area_Object.setText(str(ui.comptSurfaceFace))
        ui.LE_03_Length_Total.setText(str(ui.comptLengthTotal))
        ui.LE_04_Length_Object.setText(str(ui.comptLengthObject))
#        print "clearSelection"

s=SelObserver()
FreeCADGui.Selection.addObserver(s)          # installe la fonction en mode resident
###################################################################################################

doc = FreeCAD.ActiveDocument
if doc == None:
    doc = FreeCAD.newDocument()

MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow(MainWindow)
ui.setupUi(MainWindow)
MainWindow.show()

Version

ver 00.03 (26/12/2017)  : replace test with (FreeCAD.ActiveDocument.getObject(obj), sub) == False)

ver 00.02 (26/12/2017)  :

ver 00.01 (25/12/2017)  :

Other languages: