[Feature Request] Independent views for each file

Post here for help on using FreeCAD's graphical user interface (GUI).
Forum rules
and Helpful information
IMPORTANT: Please click here and read this first, before asking for help

Also, be nice to others! Read the FreeCAD code of conduct!
leoheck
Posts: 106
Joined: Tue Mar 13, 2018 5:56 pm

[Feature Request] Independent views for each file

Postby leoheck » Fri Jul 19, 2019 6:56 pm

Hello folks.

I use to work on Freecad on multiples files. It is cool to have tabs so I can easily switch from one model to another.

The issue I'm facing here is actually 2.

1. I don't use the same workbench on all files. When I need to change the tab/file being edited, I have to change the Workbench too because the state of the app is something global.

2. When I am editing a sketch with the "Part Design" workbench, for example, I have to close the current edition to be able to edit another part.

So my questions are:

Why the behavior is the way it is?
There are any plans to improve this in the future?

Thanks.
TheMarkster
Posts: 1060
Joined: Thu Apr 05, 2018 1:53 am

Re: [Feature Request] Independent views for each file

Postby TheMarkster » Fri Jul 19, 2019 8:19 pm

I don't know if this will help you or not, but you can have multiple instances of FreeCAD open at the same time, a different file in each instance.
User avatar
papyblaise
Posts: 634
Joined: Thu Jun 13, 2019 4:28 pm
Location: France

Re: [Feature Request] Independent views for each file

Postby papyblaise » Sat Jul 20, 2019 7:17 am

Hello
but you can have multiple instances of FreeCAD open at the same time
and also you can open a old file with V16 , a current whith V18 and a new one Whith V19 if you like :!:
leoheck
Posts: 106
Joined: Tue Mar 13, 2018 5:56 pm

Re: [Feature Request] Independent views for each file

Postby leoheck » Tue Jul 23, 2019 8:27 pm

Yes, I know it, but it has tabs, it will be nice to have the proper behavior, right?
openBrain
Posts: 2164
Joined: Fri Nov 09, 2018 5:38 pm

Re: [Feature Request] Independent views for each file

Postby openBrain » Tue Jul 23, 2019 8:36 pm

As previously said by @TheMarkster, just run several FC instances. ;)
User avatar
dcapeletti
Posts: 383
Joined: Wed Jul 23, 2014 2:27 pm

Re: [Feature Request] Independent views for each file

Postby dcapeletti » Tue Jul 23, 2019 8:57 pm

Hi, maybe it would be useful to switch workbenches with key combinations.
Is this currently possible?

Thanks
User avatar
dcapeletti
Posts: 383
Joined: Wed Jul 23, 2014 2:27 pm

Re: [Feature Request] Independent views for each file

Postby dcapeletti » Tue Jul 23, 2019 11:17 pm

Hello, with this macro by pressing the A key, you get a series of circles that are the different workbenches and simply move the mouse over them and press the A again and the workbench will load immediately.

Code: Select all

from __future__ import division
import FreeCADGui as Gui
from PySide import QtCore, QtGui
import numpy as np

class PieButton(QtGui.QGraphicsEllipseItem):
    def __init__(self, pos=[0, 0], angle_range=(0, 1), size=[50, 50], view=None, parent=None):
        super(PieButton, self).__init__(None, scene=parent)
        self.view = view
        self.angle_range = angle_range
        self.setRect(pos[0] - size[0] / 2, pos[1] - size[1] / 2, size[0], size[1])
        self.setBrush(QtGui.QBrush(QtCore.Qt.red))
        self.setAcceptHoverEvents(True)
        self.command = None
        self.hoover = False

    def setHoover(self, value):
        if not self.hoover == value:
            self.hoover = value
            if value:
                self.setBrush(QtGui.QBrush(QtCore.Qt.blue))
                self.view.setText(self.command[0])
            else:
                self.setBrush(QtGui.QBrush(QtCore.Qt.red))


class PieView(QtGui.QGraphicsView):
    def __init__(self, key, commands, parent=None):
        super(PieView, self).__init__(parent)
        self.key = key
        self.setWindowFlags(QtCore.Qt.Widget | QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        self.setStyleSheet("QGraphicsView {border-style: none; background: transparent;}" )
        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.scene = QtGui.QGraphicsScene(self)
        self.scene.setSceneRect(-200, -200, 400, 400)
        self.setScene(self.scene)
        self.center = [0, 0]
        self.buttons = []
        self.label = QtGui.QGraphicsSimpleTextItem("")
        self.scene.addItem(self.label)
        self.add_commands(commands)

    def setText(self, text):
        self.label.setText(text)
        self.label.update()
        self.label.setPos(-self.label.sceneBoundingRect().width() / 2, 0)

    def add_commands(self, commands):
        num = len(commands)
        r = 100
        a = 70
        pie_phi = np.linspace(0, np.pi * 2, num + 1)
        phi = [(p + pie_phi[i + 1]) / 2 for i, p in enumerate(pie_phi[:-1])]
        for i, command in enumerate(commands):
            button = PieButton(
                [r * np.cos(phi[i]), r * np.sin(phi[i])],
                [pie_phi[i], pie_phi[i + 1]],
                [a, a], self, self.scene)
            button.command = command
            self.scene.addItem(button)
            self.buttons.append(button)

    def mouseMoveEvent(self, event):
        r2, angle = self.polarCoordinates
        hoover = False
        for item in self.buttons:
            if (item.angle_range[0] < angle and
                angle < item.angle_range[1] and
                r2 > 1000):
                item.setHoover(True)
                hoover = True
            else:
                item.setHoover(False)
        if not hoover:
            self.setText("")

    @property
    def polarCoordinates(self):
        pos = QtGui.QCursor.pos() - self.center
        r2 = pos.x() ** 2 + pos.y() ** 2
        angle = np.arctan2(pos.y(), pos.x())
        return r2, angle + (angle < 0) * 2 * np.pi

    def showAtMouse(self, event):
        if event["Key"] == self.key:
            self.show()
            self.center = QtGui.QCursor.pos()
            self.move(self.center.x()-(self.width()/2), self.center.y()-(self.height()/2))

    def keyReleaseEvent(self, event):
        super(PieView, self).keyReleaseEvent(event)
        if event.key() == QtGui.QKeySequence(self.key):
            if not event.isAutoRepeat():
                for item in self.scene.items():
                    if hasattr(item, "hoover"):
                        if item.hoover:
                            item.command[1]()
                self.hide()


if __name__ == "__main__":
    def part_design(): Gui.activateWorkbench("PartDesignWorkbench")
    def part(): Gui.activateWorkbench("PartWorkbench")
    def draft(): Gui.activateWorkbench("DraftWorkbench")
    def arch(): Gui.activateWorkbench("ArchWorkbench")
    def fem(): Gui.activateWorkbench("FemWorkbench")
    def sketch(): Gui.activateWorkbench("SketcherWorkbench")
    def draw(): Gui.activateWorkbench("DrawingWorkbench")
    def mesh(): Gui.activateWorkbench("MeshWorkbench")

    command_list = [
        ["PartDesign", part_design],
        ["Part", part],
        ["Draft", draft],
        ["Arch", arch],
        ["Fem", fem],
        ["sketch", sketch],
        ["draw", draw],
        ["mesh", mesh]]

    a = PieView("a", command_list)
    view = Gui.ActiveDocument.ActiveView
    view.addEventCallback("SoKeyboardEvent", a.showAtMouse)
Please see https://forum.freecadweb.org/viewtopic.php?f=22&t=10892
Attachments
animation.gif
animation.gif (870.22 KiB) Viewed 321 times
User avatar
sgrogan
Posts: 5419
Joined: Wed Oct 22, 2014 5:02 pm

Re: [Feature Request] Independent views for each file

Postby sgrogan » Tue Jul 23, 2019 11:21 pm

An advanced version is available in Tools > Addons manager
https://github.com/triplus/PieMenu
User avatar
Kunda1
Posts: 5764
Joined: Thu Jan 05, 2017 9:03 pm

Re: [Feature Request] Independent views for each file

Postby Kunda1 » Tue Jul 23, 2019 11:26 pm

This is super promising!
Reminds me of @triplus's addon, PieMenu
I like the reactivity of the macro. What would be wicked cool is:
1) if when you hovered over to the circle of your choice then it would disappear all the circles you didn't choose and the circle chosen now becomes the center hub. Around that circle would emerge all the circles that represent the commands of that specific workbench you chose.
2) that the macro would learn from you most used commands and bring them up as larger circles or faster access circles
Want to contribute back to FC? Checkout:
#lowhangingfruit | Use the Source, Luke. | How to Help FreeCAD | How to report FC bugs and features
User avatar
dcapeletti
Posts: 383
Joined: Wed Jul 23, 2014 2:27 pm

Re: [Feature Request] Independent views for each file

Postby dcapeletti » Tue Jul 23, 2019 11:35 pm

And let the circles have the icons of the workbenches :)