A2plus Workbench/pl: Difference between revisions

From FreeCAD Documentation
(Created page with "==Operowanie wiązaniami==")
(Created page with "# uruchom tę pętlę, gdy okno dialogowe jest widoczne while AnimationDialog.isVisible(): # aktualizacja widoku; ważne, aby system operacyjny otrzymał informację zwrotną, że okno dialogowe jest aktywne FreeCADGui.updateGui() # przeniesienie okna dialogowego na przód, tak aby było ono zawsze widoczne QtGui.QWidget.raise_(AnimationDialog) # wartość wyjściowa suwaka również tutaj, ponieważ podczas obliczeń suwak mógł zostać przesunięty...")
 
(123 intermediate revisions by the same user not shown)
Line 2: Line 2:
[[Image:A2p_workbench.svg|thumb|128px|Ikonka FreeCAD dla środowiska pracy A2plus]]
[[Image:A2p_workbench.svg|thumb|128px|Ikonka FreeCAD dla środowiska pracy A2plus]]


<span id="Introduction"></span>
==Wprowadzenie==
==Wprowadzenie==


Line 10: Line 11:
Niniejsza dokumentacja opisuje wersję A2plus '''0.4.56 lub nowszą'''.
Niniejsza dokumentacja opisuje wersję A2plus '''0.4.56 lub nowszą'''.


<span id="Installing"></span>
==Instalacja==
==Instalacja==


Line 16: Line 18:
Kod A2plus jest przechowywany i rozwijany [https://github.com/kbwbe/A2plus na GitHub] i może być również zainstalowany ręcznie poprzez skopiowanie go do katalogu {{FileName|Mod}} programu FreeCAD.
Kod A2plus jest przechowywany i rozwijany [https://github.com/kbwbe/A2plus na GitHub] i może być również zainstalowany ręcznie poprzez skopiowanie go do katalogu {{FileName|Mod}} programu FreeCAD.


<span id="Getting_Started"></span>
==Rozpoczęcie pracy==
==Rozpoczęcie pracy==


Line 34: Line 37:
Aby zapisać złożenie i zamknąć je po zakończeniu, można użyć przycisku paska narzędzi [[Image:A2p Save and exit.svg|24px]].
Aby zapisać złożenie i zamknąć je po zakończeniu, można użyć przycisku paska narzędzi [[Image:A2p Save and exit.svg|24px]].


Toggling the toolbar button [[Image:A2p CD_OneButton.svg|24px]] sets the way you can select several several edges, faces etc.: Either with a single click or by {{KEY|Ctrl}}+click.
Przełączanie przycisku paska narzędzi [[Image:A2p CD_OneButton.svg|24px]] ustawia sposób, zaznaczenia kilku krawędzi, ścian itp.: albo za pomocą pojedynczego kliknięcia, albo używając {{KEY|Ctrl}} + kliknięcie.


<span id="Assembling"></span>
==Montaż==
==Montaż==


Line 44: Line 48:
W przypadku złożonych wiązań między częściami środowisko pracy A2plus może nie wykonać rozwiązania wiązań. W związku z tym zapoznaj się również z punktem [[#Rozwi.C4.85zywanie_problem.C3.B3w|Rozwiązywanie problemów]], aby poznać strategie rozwiązywania takich przypadków.
W przypadku złożonych wiązań między częściami środowisko pracy A2plus może nie wykonać rozwiązania wiązań. W związku z tym zapoznaj się również z punktem [[#Rozwi.C4.85zywanie_problem.C3.B3w|Rozwiązywanie problemów]], aby poznać strategie rozwiązywania takich przypadków.


<span id="Keeping_track"></span>
===Bieżące monitorowanie===
===Bieżące monitorowanie===


Line 54: Line 59:
* Każdą część można uczynić przezroczystą za pomocą normalnej edycji w programie FreeCAD. Jednak czasami ustawienie przezroczystości dla części jest tracone przy ponownym otwieraniu złożenia z powodu błędu w programie FreeCAD. Jako obejście tego problemu możesz użyć przycisku paska narzędzi [[Image:A2p_Restore_Transparency.svg|24px]], aby przywrócić ustawienia przezroczystości.
* Każdą część można uczynić przezroczystą za pomocą normalnej edycji w programie FreeCAD. Jednak czasami ustawienie przezroczystości dla części jest tracone przy ponownym otwieraniu złożenia z powodu błędu w programie FreeCAD. Jako obejście tego problemu możesz użyć przycisku paska narzędzi [[Image:A2p_Restore_Transparency.svg|24px]], aby przywrócić ustawienia przezroczystości.


<span id="Constraints"></span>
===Wiązania===
===Wiązania===


Line 67: Line 73:
A2plus zapewnia następujące wiązania:
A2plus zapewnia następujące wiązania:


<span id="Point_on_Point"></span>
====Punkt w punkcie====
====Punkt w punkcie====


Wybierz [[Glossary#Vertex|wierzchołek]] ''(punkt)'', okrąg lub sferę na każdej części. Jeśli wybrano okrąg lub sferę, to jej punkt środkowy zostanie użyty w Wiązaniu. Przycisk na pasku narzędzi [[Image:A2p PointIdentity.svg|24px]] dodaje wiązanie {{Variable|PunktIdentyfikacja}}, które sprawia, że wierzchołki są zbieżne.
Wybierz [[Glossary#Vertex|wierzchołek]] ''(punkt)'', okrąg lub sferę na każdej części. Jeśli wybrano okrąg lub sferę, to jej punkt środkowy zostanie użyty w Wiązaniu. Przycisk na pasku narzędzi [[Image:A2p PointIdentity.svg|24px]] dodaje wiązanie {{Variable|PunktIdentyfikacja}}, które sprawia, że wierzchołki są zbieżne.


<span id="Point_on_Line"></span>
====Punkt na linii====
====Punkt na linii====


Wybierz [[Glossary#Vertex|wierzchołek]] ''(punkt)'', lub okrągłą [[Glossary#Edge|krawędź]] ''(wybierze jej punkt środkowy)'', lub kulistą [[Glossary#Face|ścinę]] ''(również wybierze jej punkt środkowy)'' na jednej części i [[Glossary#Edge|krawędź]] na drugiej. Przycisk paska narzędzi [[Image:A2p PointOnLineConstraint.svg|24px]] dodaje wiązanie {{Variable|PunktNaLinii}}. Spowoduje ono umieszczenie wierzchołka na krawędzi.
Wybierz [[Glossary#Vertex|wierzchołek]] ''(punkt)'', lub okrągłą [[Glossary#Edge|krawędź]] ''(wybierze jej punkt środkowy)'', lub kulistą [[Glossary#Face|ścinę]] ''(również wybierze jej punkt środkowy)'' na jednej części i [[Glossary#Edge|krawędź]] na drugiej. Przycisk paska narzędzi [[Image:A2p PointOnLineConstraint.svg|24px]] dodaje wiązanie {{Variable|PunktNaLinii}}. Spowoduje ono umieszczenie wierzchołka na krawędzi.


<span id="Point_on_Plane"></span>
====Punkt na płaszczyźnie====
====Punkt na płaszczyźnie====


Wybierz [[Glossary#Vertex|wierzchołek]] ''(punkt)'', okrągłą [[Glossary#Edge|krawędź]] ''(zostanie wybrany jej punkt środkowy)'' lub kulistą [[Glossary#Face|ścianę]] ''(również zostanie wybrany jej punkt środkowy)'' na jednej części i płaszczyznę na drugiej części. Przycisk paska narzędzi [[Image:A2p PointOnPlaneConstraint.svg|24px]] dodaje wiązanie {{Variable|Punkt na płaszczyźnie}}. W oknie dialogowym wiązania można określić przesunięcie między punktem a płaszczyzną. Przesunięcie to można również przerzucić między obiema stronami płaszczyzny. Jeśli przesunięcie wynosi zero, ograniczenie spowoduje umieszczenie wierzchołka na płaszczyźnie.
Wybierz [[Glossary#Vertex|wierzchołek]] ''(punkt)'', okrągłą [[Glossary#Edge|krawędź]] ''(zostanie wybrany jej punkt środkowy)'' lub kulistą [[Glossary#Face|ścianę]] ''(również zostanie wybrany jej punkt środkowy)'' na jednej części i płaszczyznę na drugiej części. Przycisk paska narzędzi [[Image:A2p PointOnPlaneConstraint.svg|24px]] dodaje wiązanie {{Variable|Punkt na płaszczyźnie}}. W oknie dialogowym wiązania można określić przesunięcie między punktem a płaszczyzną. Przesunięcie to można również przerzucić między obiema stronami płaszczyzny. Jeśli przesunięcie wynosi zero, ograniczenie spowoduje umieszczenie wierzchołka na płaszczyźnie.


<span id="Sphere_on_Sphere"></span>
====Sfera w sferze====
====Sfera w sferze====


Wybierz sferyczną [[Glossary#Powierzchnia|powierzchnię]] lub [[Glossary#Wertex|wierzchołek]] ''(punkt)'' na obu częściach. Przycisk na pasku narzędzi [[Image:A2p SphericalSurfaceConstraint.svg|24px]] dodaje wiązanie {{Variable|sphereCenterIdent}} ''(sfera o wspólnym środku)''. Sprawi ono, że środki sfer, środki sfery i wierzchołka lub wierzchołki będą się pokrywać.
Wybierz sferyczną [[Glossary#Powierzchnia|powierzchnię]] lub [[Glossary#Wertex|wierzchołek]] ''(punkt)'' na obu częściach. Przycisk na pasku narzędzi [[Image:A2p SphericalSurfaceConstraint.svg|24px]] dodaje wiązanie {{Variable|sphereCenterIdent}} ''(sfera o wspólnym środku)''. Sprawi ono, że środki sfer, środki sfery i wierzchołka lub wierzchołki będą się pokrywać.


<span id="Circular_Edge_on_Circular_Edge"></span>
====Okrągła krawędź na okrągłej krawędzi====
====Okrągła krawędź na okrągłej krawędzi====


Wybierz okrągłą krawędź [[Glossary#Edge|krawędź]] na obu częściach. Przycisk na pasku narzędzi [[Image:A2p CircularEdgeConstraint.svg|24px]] dodaje wiązanie {{Variable|circularEdge}}. W oknie dialogowym wiązania można określić przesunięcie między krawędziami. To przesunięcie może być również odwrócone. Ponadto można ustawić kierunek wiązania i zablokować obrót części. Jeśli przesunięcie wynosi zero, wiązanie spowoduje, że krawędzie będą koncentrycznie leżeć w tej samej płaszczyźnie.
Wybierz okrągłą krawędź [[Glossary#Edge|krawędź]] na obu częściach. Przycisk na pasku narzędzi [[Image:A2p CircularEdgeConstraint.svg|24px]] dodaje wiązanie {{Variable|circularEdge}}. W oknie dialogowym wiązania można określić przesunięcie między krawędziami. To przesunięcie może być również odwrócone. Ponadto można ustawić kierunek wiązania i zablokować obrót części. Jeśli przesunięcie wynosi zero, wiązanie spowoduje, że krawędzie będą koncentrycznie leżeć w tej samej płaszczyźnie.


<span id="Axis_Coincident"></span>
====Zbieżność osi====
====Zbieżność osi====


Wybierz cylindryczną [[Glossary#Face|Powierzchnię]] lub liniową [[Glossary#Edge|Krawędź]] na obu częściach. Przycisk na pasku narzędzi [[Image:A2p AxialConstraint.svg|24px]] dodaje wiązanie {{Variable|Zbieżność osi}}. W oknie dialogowym wiązania można określić kierunek osi. W oknie tym można również zablokować obrót części. Wiązanie spowoduje, że osie lub linie będą zbieżne.
Wybierz cylindryczną [[Glossary#Face|Powierzchnię]] lub liniową [[Glossary#Edge|Krawędź]] na obu częściach. Przycisk na pasku narzędzi [[Image:A2p AxialConstraint.svg|24px]] dodaje wiązanie {{Variable|Zbieżność osi}}. W oknie dialogowym wiązania można określić kierunek osi. W oknie tym można również zablokować obrót części. Wiązanie spowoduje, że osie lub linie będą zbieżne.


<span id="Axis_Parallel"></span>
====Równoległość osi====
====Równoległość osi====


Wybierz cylindryczną [[Glossary#Face|powierzchnię]] lub liniową [[Glossary#Edge|krawędź]] na obu częściach. Przycisk na pasku narzędzi [[Image:A2p AxisParallelConstraint.svg|24px]] dodaje wiązanie {{Variable|równoległości osi}}. W oknie dialogowym ograniczenia można określić kierunek osi. Ograniczenie sprawi, że osie lub linie będą równoległe.
Wybierz cylindryczną [[Glossary#Face|powierzchnię]] lub liniową [[Glossary#Edge|krawędź]] na obu częściach. Przycisk na pasku narzędzi [[Image:A2p AxisParallelConstraint.svg|24px]] dodaje wiązanie {{Variable|równoległości osi}}. W oknie dialogowym ograniczenia można określić kierunek osi. Ograniczenie sprawi, że osie lub linie będą równoległe.


<span id="Axis_on_Plane_parallel"></span>
====Oś na płaszczyźnie równoległej====
====Oś na płaszczyźnie równoległej====


Wybierz cylindryczną [[Glossary#Face|powierzchnię]] lub liniową [[Glossary#Edge|krawędź]] na jednej części i płaszczyznę na drugiej części. Przycisk paska narzędzi [[Image:A2p AxisPlaneParallelConstraint.svg|24px]] dodaje wiązanie {{Variable|Oś na płaszczyźnie równoległej}}. Dzięki temu wiązaniu oś lub prosta będzie równoległa do płaszczyzny.
Wybierz cylindryczną [[Glossary#Face|powierzchnię]] lub liniową [[Glossary#Edge|krawędź]] na jednej części i płaszczyznę na drugiej części. Przycisk paska narzędzi [[Image:A2p AxisPlaneParallelConstraint.svg|24px]] dodaje wiązanie {{Variable|Oś na płaszczyźnie równoległej}}. Dzięki temu wiązaniu oś lub prosta będzie równoległa do płaszczyzny.


<span id="Axis_on_Plane_normal"></span>
====Oś na płaszczyźnie normalnej====
====Oś na płaszczyźnie normalnej====


Wybierz cylindryczną [[Glossary#Face|powierzchnię]] lub liniową [[Glossary#Edge|krawędź]] na jednej części i płaszczyznę na drugiej części. Przycisk paska narzędzi [[Image:A2p AxisPlaneNormalConstraint.svg|24px]] dodaje wiązanie {{Variable|Oś na płaszczyźnie normalnej}}. Wiązanie spowoduje, że oś lub linia będzie normalna do płaszczyzny.
Wybierz cylindryczną [[Glossary#Face|powierzchnię]] lub liniową [[Glossary#Edge|krawędź]] na jednej części i płaszczyznę na drugiej części. Przycisk paska narzędzi [[Image:A2p AxisPlaneNormalConstraint.svg|24px]] dodaje wiązanie {{Variable|Oś na płaszczyźnie normalnej}}. Wiązanie spowoduje, że oś lub linia będzie normalna do płaszczyzny.


<span id="Axis_on_Plane_angle"></span>
====Kąt osi na płaszczyźnie====
====Kąt osi na płaszczyźnie====


Wybierz cylindryczną [[Glossary#Face|powierzchnię]] lub liniową [[Glossary#Edge|krawędź]] na jednej części i płaszczyznę na drugiej części. Przycisk paska narzędzi [[Image:A2p AxisPlaneAngleConstraint.svg|24px]] dodaje wiązanie {{Variable|axisPlaneAngleAngle}}. Początkowo wiązanie sprawi, że oś będzie równoległa do płaszczyzny. Następnie można dostosować kąt dla osi w pojawiającym się oknie dialogowym ustawień wiązania.
Wybierz cylindryczną [[Glossary#Face|powierzchnię]] lub liniową [[Glossary#Edge|krawędź]] na jednej części i płaszczyznę na drugiej części. Przycisk paska narzędzi [[Image:A2p AxisPlaneAngleConstraint.svg|24px]] dodaje wiązanie {{Variable|axisPlaneAngleAngle}}. Początkowo wiązanie sprawi, że oś będzie równoległa do płaszczyzny. Następnie można dostosować kąt dla osi w pojawiającym się oknie dialogowym ustawień wiązania.


<span id="Plane_Parallel"></span>
====Równoległe płaszczyzny====
====Równoległe płaszczyzny====


Zaznacz płaszczyznę na obu częściach. Przycisk na pasku narzędzi [[Image:A2p PlanesParallelConstraint.svg|24px]] dodaje wiązanie {{Variable|RównoległePłaszczyzny}}. W oknie dialogowym wiązania można określić kierunek wiązania. Użycie tego wiązania spowoduje, że płaszczyzny będą równoległe.
Zaznacz płaszczyznę na obu częściach. Przycisk na pasku narzędzi [[Image:A2p PlanesParallelConstraint.svg|24px]] dodaje wiązanie {{Variable|RównoległePłaszczyzny}}. W oknie dialogowym wiązania można określić kierunek wiązania. Użycie tego wiązania spowoduje, że płaszczyzny będą równoległe.


<span id="Plane_on_Plane"></span>
====Płaszczyzna na płaszczyźnie====
====Płaszczyzna na płaszczyźnie====


Select a plane on both parts. The toolbar button [[Image:A2p PlaneCoincidentConstraint.svg|24px]] adds the constraint {{Variable|planeCoincident}}. The constraint dialog allows you to specify a constraint direction and an offset between the planes. This offset can also be flipped. If the offset is zero, the constraint will make the planes coincident.
Wybierz płaszczyznę na obu częściach. Przycisk na pasku narzędzi [[Image:A2p PlaneCoincidentConstraint.svg|24px]] dodaje wiązanie {{Variable|Zbieżność płaszczyzn}}. Okno dialogowe wiązania pozwala określić kierunek wiązania i przesunięcie między płaszczyznami. Przesunięcie to może być również odwrócone. Jeśli przesunięcie wynosi zero, wiązanie spowoduje, że płaszczyzny będą się pokrywać.


<span id="Plane_Angular"></span>
==== Plane Angular ====
====Płaszczyzna kątowa====


Select a plane on both parts. The toolbar button [[Image:A2p AngleConstraint.svg|24px]] adds the constraint {{Variable|angledPlanes}}. The constraint dialog allows you to specify an angle between the planes. The constraint will make the planes at first parallel and the set the specified angle.
Wybierz płaszczyznę na obu częściach. Przycisk paska narzędzi [[Image:A2p AngleConstraint.svg|24px]] dodaje wiązanie {{Variable|angledPlanes}}. Okno dialogowe wiązania pozwala określić kąt między płaszczyznami. Wiązanie sprawi, że płaszczyzny będą najpierw równoległe, a następnie ustawi określony kąt.


<span id="Coincidence_at_Center_of_Mass"></span>
==== Coincidence at Center of Mass ====
====Zbieżność w środku masy====


Select either a closed [[Glossary#Edge|edge]] or a plane on both parts. The toolbar button [[Image:A2p CenterOfMassConstraint.svg|24px]] adds the constraint {{Variable|centerOfMass}}. The constraint dialog allows you to specify an offset between the edges or planes. This offset can also be flipped. You can furthermore set the constraint direction and lock the rotation of the parts. If the offset is zero, the constraint will put the edges or planes into the same plane.
Wybierz zamkniętą [[Glossary#Edge|krawędź]] lub płaszczyznę na obu częściach. Przycisk paska narzędzi [[Image:A2p CenterOfMassConstraint.svg|24px]] dodaje ograniczenie {{Variable|centerOfMass}}. Okno dialogowe wiązania pozwala określić przesunięcie między krawędziami lub płaszczyznami. Przesunięcie to można również odwrócić. Ponadto można ustawić kierunek wiązania i zablokować obrót części. Jeśli przesunięcie wynosi zero, wiązanie umieści krawędzie lub płaszczyzny w tej samej płaszczyźnie.


<span id="Subassemblies"></span>
===Montaż podzespołów===
===Montaż podzespołów===


An assembly can contain other assemblies. They are added like parts by pressing the toolbar button [[Image:A2p ImportPart.svg|24px]] and selecting a {{FileName|*.FCStd}} file containing an assembly. Such subassemblies can also be edited like parts using the toolbar button [[Image:A2p EditPart.svg|24px]]. Please make sure for higher assembly stages that you update the assembly recursively via the toolbar button [[File:A2p_RecursiveUpdate.svg|24px]] when there were changes.
Złożenie może zawierać inne złożenia. Dodaje się je jak części, naciskając przycisk paska narzędzi [[Image:A2p ImportPart.svg|24px]] i wybierając plik {{FileName|*.FCStd}} zawierający zespół. Takie podzespoły mogą być również edytowane jak części za pomocą przycisku paska narzędzi [[Image:A2p EditPart.svg|24px]]. W przypadku wyższych etapów montażu należy upewnić się, że zespół został zaktualizowany rekursywnie za pomocą przycisku paska narzędzi [[File:A2p_RecursiveUpdate.svg|24px]] po wprowadzeniu zmian.


<span id="Constraint_Handling"></span>
==Operowanie wiązaniami==
==Operowanie wiązaniami==


Possible constraints for a selection are displayed in the toolbar and the ''Constraint Tools'' dialog by enabling the corresponding buttons. The ''Constraint Tools'' dialog is opened via the toolbar button [[Image:A2p DefineConstraints.svg|24px]]. It is intended to stay open to be able to add quickly several constraints to the assembly.
Możliwe wiązania dla zaznaczenia wyświetlane na pasku narzędzi i w oknie dialogowym ''Narzędzia wiązań'' poprzez włączenie odpowiednich przycisków. Okno dialogowe ''Narzędzia wiązań'' jest otwierane za pomocą przycisku na pasku narzędzi [[Image:A2p DefineConstraints.svg|24px]]. Powinno ono pozostać otwarte, aby móc szybko dodać kilka wiązań do zespołu.


Existing constraints can be edited by selecting them in the model tree and then either double-clicking on it or using the toolbar button [[Image:A2p EditConstraint.svg|24px]]. This opens the ''Constraint Properties'' dialog.
Istniejące wiązania mogą być edytowane poprzez zaznaczenie ich w drzewie modelu, a następnie dwukrotne kliknięcie na nie lub użycie przycisku na pasku narzędzi [[Image:A2p EditConstraint.svg|24px]]. Umożliwi to otwarcie okna dialogowego ''Właściwości wiązania''.


Wiązania można tymczasowo wyciszyć, zaznaczając je w drzewie modelu i zmieniając właściwość elementu drzewa {{PropertyData|Stłumione}}.
Wiązania można tymczasowo wyciszyć, zaznaczając je w drzewie modelu i zmieniając właściwość elementu drzewa {{PropertyData|Stłumione}}.


Constraints can be deleted either by selecting them in the model tree and pressing {{KEY|Del}} or by selecting a part with constraints in the model tree and using the toolbar button [[Image:A2p DeleteConnections.svg|24px]].
Wiązania mogą zostać usunięte poprzez zaznaczenie ich w drzewie modelu i naciśnięcie przycisku {{KEY|Del}} lub poprzez zaznaczenie części z wiązaniami w drzewie modelu i użycie przycisku paska narzędzi [[Image:A2p DeleteConnections.svg|24px]].


All constraints can be resolved at any time with the toolbar button [[Image:A2p solver.svg|24px]]. If the toolbar button [[Image:A2p ToggleAutoSolve.svg|24px]] is turned on a resolve is automatically done after every edit of a constraint.
Wszystkie wiązania mogą być rozwiązane w dowolnym momencie za pomocą przycisku paska narzędzi [[Image:A2p solver.svg|24px]]. Jeśli przycisk paska narzędzi [[Image:A2p ToggleAutoSolve.svg|24px]] jest włączony, rozwiązanie jest wykonywane automatycznie po każdej edycji wiązania.


The toolbar button [[Image:A2p FlipConstraint.svg|24px]] affects the constraint that was added most recently. It flips the constraint direction.
Przycisk paska narzędzi [[Image:A2p FlipConstraint.svg|24px]] wpływa na ostatnio dodane wiązanie. Odwraca on kierunek wiązania.


Za pomocą narzędzia [[Image:A2p CD_ConstraintViewer.svg|24px]] można wyświetlać i sprawdzać istniejące wiązania. Po kliknięciu pojawi się okno dialogowe. Następnie należy wybrać część w drzewie i kliknąć przycisk {{Button|Importuj z drzewa}}, aby uzyskać wszystkie wiązania tej części, lub wybrać jedno lub więcej wiązań w drzewie i kliknąć przycisk {{Button|Importuj z drzewa}}. W rezultacie otrzymasz wszystkie informacje o ograniczeniach. Klikając w kolumnie "Pomiń" można wyłączyć pojedyncze wiązanie. Więcej informacji można znaleźć w podpowiedziach innych przycisków okna dialogowego.
With the [[Image:A2p CD_ConstraintViewer.svg|24px]] tool, it is possible the show and inspect existing constraints. After clicking it a dialog pops up. Then either select a part in the tree and click the button {{Button|Import from part}} to get all constraints of this part, or select one or more constraints in the tree and click the button {{Button|Import from Tree}}. As result you get all info about the constraints. By clicking in the column ''Suppress'' a single constraint can be suppressed. For more features, follow the tooltips of the other dialog buttons.


<span id="Part_Lists"></span>
== Part Lists ==
==Lista części==


To create part lists of assemblies, the different parts of the assembly must get part info that can be read by A2plus. This is done by editing the part using the toolbar button [[Image:A2p EditPart.svg|24px]]. In the opened part press the toolbar button [[Image:A2p PartsInfo.svg|24px]] and a [[Spreadsheet_Workbench|spreadsheet]] with the name ''#PARTINFO#'' is created.
Aby stworzyć listę części dla złożenia, poszczególne części złożenia muszą otrzymać informacje, które mogą być odczytane przez A2plus. Robi się to poprzez edycję części za pomocą przycisku na pasku narzędzi [[Image:A2p EditPart.svg|24px]]. W otwartej części naciśnij przycisk paska narzędzi [[Image:A2p PartsInfo.svg|24px]] i zostanie utworzony [[Spreadsheet_Workbench/pl|arkusz kalkulacyjny]] nazwany ''#PARTINFO#''.


Struktura arkusza kalkulacyjnego wygląda następująco:
The structure of the spreadsheet is like this:


[[Image:A2p PartinfoTable.png]]
[[Image:A2p PartinfoTable.png]]


Wypełnij szare pola informacjami, które chcesz mieć na docelowej liście części.
Fill out the grey fields with info you have and want to have in the final parts list.


In the assembly or subassembly use the toolbar button [[Image:A2p PartsList.svg|24px]]. It will ask you if you want to iterate recursively over all subassemblies. Click on ''Yes''. This creates a new spreadsheet with the name ''#PARTSLIST#''. It contains the info from the different ''#PARTSINFO#'' spreadsheets of the parts in a list like this:
W złożeniu lub podzespole użyj przycisku paska narzędzi [[Image:A2p PartsList.svg|24px]]. Pojawi się pytanie, czy chcesz iterować rekurencyjnie po wszystkich podzespołach. Kliknij na ''Yes''. Spowoduje to utworzenie nowego arkusza kalkulacyjnego o nazwie ''#PARTSLIST#''. Zawiera on informacje z różnych arkuszy kalkulacyjnych ''#PARTSINFO#'' części na liście takiej jak ta:


[[Image:A2p PartslistTable.png]]
[[Image:A2p PartslistTable.png]]


Pozycja ''(POS)'' jest automatycznie ustawiana zgodnie z wyglądem części w drzewie modelu. Część najwyższego poziomu otrzyma POS 1.
The position (POS) is automatically set according to the appearance of the parts in the model tree. The top level part will get POS 1.


Ilość ''(QTY)'' jest automatycznie obliczana na podstawie złożenia. Jeśli część występuje dwukrotnie w zespole, otrzyma QTY 2.
The quantity (QTY) is automatically calculated from the assembly. If a parts is twice in the assembly it will get QTY 2.


If you have updated a part info you can refresh the parts list by pressing the toolbar button [[Image:A2p PartsList.svg|24px]] again.
Jeśli zaktualizowałeś informacje o części, możesz odświeżyć listę części, naciskając ponownie przycisk paska narzędzi [[Image:A2p PartsList.svg|24px]].


Dla złożeń podrzędnych można również utworzyć arkusz informacyjny za pomocą przycisku paska narzędzi [[Image:A2p PartsInfo.svg|24px]]. Podczas tworzenia lub aktualizowania listy części głównego złożenia informacje te będą używane, jeśli klikniesz ''Nie'' na pytanie, czy chcesz iterować rekurencyjnie po wszystkich podzespołach. Wówczas różne części nie znajdują się na liście części, a jedynie w złożeniach podrzędnych.
For subassemblies you can also create an info spreadsheet using the toolbar button [[Image:A2p PartsInfo.svg|24px]]. When you create or update the parts list of the main assembly this info will be used if you click on ''No'' for the question if you want to iterate recursively over all subassemblies. Then the different parts are not in the parts list but only the subassemblies.


<span id="Special_Features"></span>
== Special Features ==
==Funkcje specjalne==


<span id="Assembly_Structure"></span>
=== Assembly Structure ===
===Struktura złożenia===


The toolbar button [[Image:A2p Treeview.svg|24px]] creates an HTML file with the structure of your assembly. The file will by default be created in the folder of your assembly file. The structure looks like this:
Przycisk paska narzędzi [[Image:A2p Treeview.svg|24px]] tworzy plik HTML ze strukturą złożenia. Plik zostanie domyślnie utworzony w folderze pliku złożenia. Struktura wygląda następująco:


:[[Image:A2p Dependency-Tree.jpg]]
:[[Image:A2p Dependency-Tree.jpg]]


<span id="Degrees_of_Freedom"></span>
=== Degrees of Freedom ===
===Stopnie swobody===


The button [[Image:A2p DOFs.svg|24px]] labels every part of the assembly with its degrees of freedom. Furthermore it outputs a list with all parts and their dependencies. The list is output into FreeCAD's widget ''Report view''. If this widget is currently not visible, it can either be shown by right-clicking into an empty part of the FreeCAD toolbar area and then choosing it in the appearing context menu or with the menu {{MenuCommand|ViewPanels → [[Report view|Report view]]}}.
Przycisk [[Image:A2p DOFs.svg|24px]] oznacza każdą część złożenia z jej stopniami swobody. Ponadto wyświetla listę wszystkich części i ich zależności. Lista jest wyprowadzana do widżetu FreeCAD ''Widok raportu''. Jeśli widżet ten nie jest obecnie widoczny, można go wyświetlić, klikając prawym przyciskiem myszy pustą część obszaru paska narzędzi FreeCAD, a następnie wybierając go w wyskakującym menu podręcznym lub za pomocą menu {{MenuCommand|WidokPanele → [[Report_view/pl|Widok raportu]]}}.


The degrees of freedom labels can be removed by clicking the button [[Image:A2p DOFs.svg|24px]] again.
Etykiety stopni swobody można usunąć, klikając ponownie przycisk [[Image:A2p DOFs.svg|24px]].


<span id="Part_Labels"></span>
=== Part Labels ===
===Etykiety części===


The button [[Image:A2p PartLabel.svg|24px]] labels every part of the assembly in the 3D view with its name. The part labels can be removed by clicking the button [[Image:A2p PartLabel.svg|24px]] again
Przycisk [[Image:A2p PartLabel.svg|24px]] oznacza każdą część złożenia w widoku 3D jej nazwą. Etykiety części można usunąć, klikając ponownie przycisk [[Image:A2p PartLabel.svg|24px]].


<span id="Shape_of_whole_Assembly"></span>
=== Shape of whole Assembly ===
===Kształt całego złożenia===


Sometimes it is necessary to have the whole assembly combined as one shape. This shape can then for example be used for 3D printing in the [[Mesh_Workbench|Mesh workbench]] or for drawings in the [[TechDraw_Workbench|TechDraw workbench]]. It is created using the toolbar button [[Image:A2p_SimpleAssemblyShape.svg|24px]]. The shape is by default not made visible. Use the same toolbar button to update the shape in case of changes in the assembly.
Czasami konieczne jest połączenie całego złożenia w jeden kształt. Kształt ten może być następnie użyty do drukowania 3D w środowisku [[Mesh_Workbench/pl|Siatka]] lub do rysowania w środowisku [[TechDraw_Workbench/pl|Rysunek Techniczny]]. Jest on tworzony za pomocą przycisku paska narzędzi [[Image:A2p_SimpleAssemblyShape.svg|24px]]. Kształt nie jest domyślnie widoczny. Użyj tego samego przycisku paska narzędzi, aby zaktualizować kształt w przypadku zmian w złożeniu.


<span id="Convert_absolute_Paths_to_relative_Ones"></span>
=== Convert absolute Paths to relative Ones ===
===Konwersja ścieżek bezwzględnych na względne===


With the menu {{MenuCommand|A2plus → Misc → [[File:A2p_SetRelativePathes.svg|24px]] Convert absolute paths of imported parts to relative ones}} you can convert absolute paths of imported parts to relative ones.
Za pomocą opcji menu {{MenuCommand|A2plus → Misc → [[File:A2p_SetRelativePathes.svg|24px]] Konwertuj bezwzględne ścieżki importowanych części na względne}} można konwertować ścieżki importowanych części.


== Preferences ==
<span id="Preferences"></span>
==Ustawienia==


The a2plus preferences can be accessed via FreeCAD's menu {{MenuCommand|Edit → [[Preferences_Editor|Preferences]]}} and there in the section ''A2plus''. You can set the following options:
Dostęp do konfiguracji środowiska pracy A2plus można uzyskać poprzez menu FreeCAD {{MenuCommand|Edycja → [[Preferences_Editor/pl|Preferencje ...]]}} i tam w sekcji ''A2plus''. Można ustawić następujące opcje:


<span id="Default_solving_method"></span>
=== Default solving method ===
===Domyślna metoda rozwiązywania===


Użycie rozwiązywania układów cząstkowych: Rozwiązywanie rozpoczyna się od części, która ma właściwość {{PropertyData|Pozycja ustalona}} ustawioną na {{true/pl}} i części do niej związanej. Wszystkie pozostałe części nie podlegają obliczeniom. Jeśli uda się znaleźć rozwiązanie, do obliczeń dodawana jest następna związana część i tak dalej.
; Use solving of partial systems : The solver begins with a part that has the property {{PropertyData|fixed Position}} set to ''true'' and a part constrained to it. All other parts are not calculated. If a solution could be found, the next constrained part is added to the calculation and so on.
Użyj "magnetycznego" solwera, rozwiązującego wszystkie części naraz: Solwer próbuje przesunąć wszystkie części naraz w kierunku części, która ma właściwość {{PropertyData|Pozycja ustalona}} ustawioną na "true". Należy pamiętać, że w większości przypadków obliczenie rozwiązania zajmie więcej czasu.
; Use "magnetic" solver, solving all parts at once : The solver tries to move all parts at once in direction to a part that has the property {{PropertyData|fixed Position}} set to ''true''. Note that this will in most cases take more time for the calculation of a solution.
Wymuś stałą pozycję: Ustawia właściwość {{PropertyData|Pozycja ustalona}} na wartość {{true/pl}} dla wszystkich części w złożeniu. Wówczas nie są wykonywane żadne obliczenia, ponieważ wszystkie części będą zawsze ustawione w pozycjach, w których zostały utworzone.
; Force fixed position : This sets the property {{PropertyData|fixed Position}} to ''true'' for all parts in the assembly. Then no calculation is actually performed since all parts will always be fixed to the positions where they were created.


<span id="Default_solver_behaviour"></span>
=== Default solver behaviour ===
===Domyślne działanie solvera===


; Solve automatically if a constraint property is changed : The solver will automatically be started. The same as turning on the toolbar button [[Image:A2p ToggleAutoSolve.svg|24px]].
; Rozwiąż automatycznie, jeśli właściwość wiązania zostanie zmieniona : Rozwiązywanie zostanie uruchomione automatycznie. Tak samo, jak użycie przycisku paska narzędzi [[Image:A2p ToggleAutoSolve.svg|24px]].




<span id="Behaviour_when_updating_imported_parts"></span>
=== Behaviour when updating imported parts ===
===Działanie podczas aktualizacji zaimportowanych części===


; Oblicz ponownie zaimportowane części przed ich aktualizacją: Wszystkie części złożenia, w tym złożenia podrzędne, zostaną otwarte we FreeCAD w celu zrekonstruowania przy użyciu wartości z arkuszy kalkulacyjnych.<br> Ta funkcja jest przeznaczona do konstruowania w pełni parametrycznego.
; Recalculate imported parts before updating them : All parts of the assembly, including subassemblies, will be opened in FreeCAD to be reconstructed using values from spreadsheets.<br/> This feature is designed to construct fully parametrically. '''Note:''' This feature is very experimental and not recommended for important projects.<br/>Known problems:
'''Uwaga:''' Ta funkcja jest bardzo eksperymentalna i nie jest zalecana w przypadku ważnych projektów.<br/>Znane problemy:
* The assembly can be destroyed because of wrong references to topological names in parts
* Złożenie może zostać zniszczone z powodu błędnych odniesień do nazw topologicznych w częściach.
* Master spreadsheets can get broken when they are edited while a referenced part file is already closed. This can crash FreeCAD.
* Główne arkusze kalkulacyjne mogą ulec uszkodzeniu podczas edycji, gdy plik części, do którego następuje odniesienie, jest już zamknięty. Może to spowodować awarię programu FreeCAD.


Włącz rekurencyjną aktualizację importowanych części: Otwiera rekurencyjnie wszystkie zespoły podrzędne w celu ich aktualizacji.
; Enable recursive update of imported parts : Opens all subassemblies recursively to update them.


; Używanie eksperymentalnego nazewnictwa topologicznego: Podczas importowania części do złożenia algorytm generuje nazwy topologiczne dla każdego elementu podrzędnego importowanego kształtu. Nadawane nazwy topologiczne są zapisywane we własciwości {{PropertyData|mux Info}}. Kiedy zaimportowana część wymaga aktualizacji, te nazwy topologiczne są używane do aktualizacji elementów podrzędnych wiązań. Dzięki temu zespoły stają się bardziej odporne na zmienne numery elementów podrzędnych FreeCAD.<br/> '''Uwaga:''' Zwiększa to rozmiary plików i czas obliczeń podczas importowania części. Jeśli ma być używane nazewnictwo topologiczne, należy je aktywować przed utworzeniem złożenia.
; Use experimental topological naming : While importing parts to the assembly an algorithm generates topological names for each subelement of the imported shape. The topological names are written into the {{PropertyData|mux Info}}. When an imported part needs to be updated, these topological names are used to update the subelements of the constraints. So assemblies get more robust against volatile subelement numbers of FreeCAD.<br/> '''Note:''' This increases file sizes and calculation time during import of parts. If topological naming should be used it has to be activated before the assembly is created.


; Dziedziczenie przezroczystości na powierzchnię z części i podzespołów: Użyj ustawień kolorów i przezroczystości z importowanych części.<br/> '''Uwaga:''' Ta funkcja jest bardzo eksperymentalna i nie jest zalecana dla ważnych projektów.
; Inherit per face transparency from parts and subassemblies : Use colour and transparency settings from imported parts.<br/> '''Note:''' This feature is very experimental and not recommended for important projects.


; Nie importuj niewidocznych kształtów: Spowoduje to ukrycie niewidocznych kształtów odniesienia / konstrukcji. '''Uwaga:''' Żadne wiązania nie mogą być połączone z kształtami odniesienia / konstrukcji w wyższych lub innych złożeniach podrzędnych. W przeciwnym razie może dojść do uszkodzenia złożenia.
; Do not import invisible shapes : This will hide invisible datum/construction shapes. '''Note:''' No constraints must be connected to datum/construction shapes in higher or other subassemblies. Otherwise you can break the assembly.


; Use solid union for importing parts and subassemblies : All imported parts will directly be put together as union.<br/> This feature is useful for [[FEM_Workbench|FEM]] simulations or [[Manual:Preparing_models_for_3D_printing|3D-printing]] if only one solid is allowed. The alternative is to create a [[#Shape_of_whole_Assembly|shape of the whole assembly]] later on.
; Używaj łączenia brył do importowania części i złożeń: Wszystkie importowane części zostaną bezpośrednio połączone w całość.<br/> Ta funkcja jest przydatna w przypadku [[FEM_Workbench/pl|MES]] lub symulacji [[Manual:Preparing_models_for_3D_printing/pl|drukowania 3D]], jeśli dozwolona jest tylko jedna bryła. Alternatywą jest utworzenie [[#Kształt_całego_złożenia|kształtu całego zespołu]] później.


<span id="User_interface_settings"></span>
=== User interface settings ===
===Ustawienia interfejsu użytkownika===


; Show constraints in toolbar : If this option is not used, the toolbar buttons for the different constraints are not visible to save space in the toolbar. New constraints can still be set using the ''Constraint Tools'' dialog (toolbar button [[Image:A2p DefineConstraints.svg|24px]]).
Pokaż wiązania na pasku narzędzi: Jeśli ta opcja nie jest używana, przyciski paska narzędzi dla różnych wiązań nie widoczne, aby zaoszczędzić miejsce na pasku narzędzi. Nowe wiązania można nadal ustawiać za pomocą okna dialogowego '''Narzędzia wiązań''' ''(przycisk paska narzędzi [[Image:A2p DefineConstraints.svg|24px]])''.
Użyj natywnego menedżera plików systemu operacyjnego: Jeśli ta opcja jest używana, podczas wybierania plików dla złożeń wyświetlane jest okno dialogowe plików systemu operacyjnego.
; Use native file manager of your OS : If this option is used, you get the file dialog of your OS when selecting files for assemblies.


<span id="Storage_of_files"></span>
=== Storage of files ===
===Zapisywanie plików===


; Użyj ścieżek względnych dla importowanych części : Używa względnych ścieżek do plików części.
; Use relative paths for imported parts : Uses relative file paths to the part files.
; Użyj bezwzględnych ścieżek dla importowanych części: Używa bezwzględnych ścieżek do plików części.
; Use absolute paths for imported parts : Uses absolute file paths to the part files.
; Wszystkie pliki znajdują się w tym folderze projektu: Wszystkie pliki projektu umieszczone są w określonym folderze. Nie ma znaczenia, czy znajdują się w podfolderach podrzędnych. Uwaga: Żaden plik nie może być w folderze kilka razy ''(np. w różnych podfolderach)''.<br> Ta opcja jest przydatna do pracy na różnych komputerach, ponieważ wystarczy skopiować folder projektu.
; All files are in this project folder : All project files have to be in the specified folder. It doesn't matter if they are in subfolders of this folder. '''Note:''' No file is allowed to exist several times in the folder (e.g. in different subfolders).<br/> This option is helpful to work on different machines because then one only has to copy the project folder.


<span id="Troubleshooting"></span>
==Rozwiązywanie problemów==
==Rozwiązywanie problemów==


Prędzej czy później pojawi się problem, że środowisko A2plus nie może rozwiązać ustalonych wiązań. Aby temu zaradzić, istnieją różne strategie:
Sooner or later you will get the problem that A2plus cannot solve the constraints you set. To overcome this, there are different strategies:


<span id="Using_the_Conflict_Finder_Tool"></span>
=== Using the Conflict Finder Tool ===
===Korzystanie z narzędzia do wyszukiwania konfliktów===


Jest to najbezpieczniejsza metoda, gdy masz kilka ograniczeń, ponieważ narzędzie to próbuje rozwiązać jedno wiązanie po drugim, dopóki nie znajdzie konfliktowego wiązania. Następnie można przejść do innych strategii, aby rozwiązać zidentyfikowane wiązanie. Narzędzie jest wywoływane za pomocą przycisku na pasku narzędzi [[File:A2p_SearchConstraintConflicts.svg|24px]].
This is the safest method when you have several constraints because this tool attempts to solve one constraint after another until it finds the conflicting constraint. Then you can go on with the other strategies to resolve the identified constraint. The tool is called using the toolbar button [[File:A2p_SearchConstraintConflicts.svg|24px]].


<span id="Checking_Constraint_Direction"></span>
=== Checking Constraint Direction ===
===Sprawdzanie kierunku wiązania===


Czasami wiązania wydają się być spójnie zdefiniowane, ale mimo to nie można ich rozwiązać. Przykład: Załóżmy, że masz wiązanie {{Variable|[[#Równoległe_płaszczyzny|Równoległe płaszczyzny]]}} ustawione dla dwóch płaszczyzn. Teraz chcesz ustawić dla tych samych płaszczyzn wiązanie {{Variable|[[#Płaszczyzna_na_płaszczyźnie|Płaszczyzna na płaszczyźnie]]}} i A2plus nie może tego rozwiązać. Wtedy kierunki wiązań {{Variable|Równoległe płaszczyzny}} i {{Variable|Płaszczyzna na płaszczyźnie}} są różne. Użyj tego samego kierunku dla obu wiązań, aby to naprawić.
Sometimes constraints seem to be consistently defined but they can nevertheless not be solved. An example: Assume you have a {{Variable|[[#Plane_Parallel|planesParallel]]}} constraint set for two planes. Now you want to set for the same planes the {{Variable|[[#Plane_on_Plane|planeCoincident]]}} constraint and A2plus cannot solve this. Then the constraint directions of {{Variable|planesParallel}} and {{Variable|planeCoincident}} are different. Use the same direction for both constraints to fix this.


A2plus offers to automatically check the right direction for '''all''' constraints of the assembly using the toolbar button [[Image:A2p_ReAdjustConstraints.svg|24px]].
Środowisko pracy A2plus oferuje automatyczne sprawdzanie właściwego kierunku dla '''wszystkich''' wiązań złożenia za pomocą przycisku paska narzędzi [[Image:A2p_ReAdjustConstraints.svg|24px]].


<span id="Deleting_Constraints"></span>
=== Deleting Constraints ===
===Usuwanie wiązań===


Większość przypadków nierozwiązywalnych wiązań występuje bezpośrednio podczas dodawania nowego wiązania. Rozwiązaniem jest usunięcie ostatnio dodanego wiązania. A2plus również to zaproponuje.
Most cases of unsolvable constraints occur directly when adding a new constraint. The solution is then to delete the constraint you added last. A2plus will propose this, too.


Czasami strategia usuwania jest jedyną, na przykład podczas edycji części w programie FreeCAD, tak że brakuje ścian lub krawędzi połączonych z wiązaniami. Powinieneś wtedy usunąć jedno wiązanie, które jest połączone ze zmienioną częścią na raz. Użyj przycisku paska narzędzi [[Image:A2p solver.svg|24px]] po każdym usunięciu, aby sprawdzić, czy osiągnąłeś stan rozwiązywalny.
Sometimes the deletion strategy is the only one, for example when you edited a part in FreeCAD so that faces or edges connected to constraints are missing. You should then delete one constraint that is connected to the changed part at a time. Use the toolbar button [[Image:A2p solver.svg|24px]] after every deletion to see if you reached a solvable state.


Gdy masz złożenie, które można rozwiązać, dodaj krok po kroku potrzebne wiązania.
When you got an assembly that can be solved, add step by step the constraints you need.


<span id="Moving_Parts"></span>
=== Moving Parts ===
===Przesuwanie Części===


In some cases the solver only needs better start values to solve the constraints. Take for example the case that you have an axle part and a wheel part. You add a {{Variable|axisCoincident }} constraint and get no info that the solver failed but the parts are not moved accordingly and in the ''Report view'' widget of FreeCAD you see "''REACHED POS-ACCURACY :0.0''". A solution for this is to move the parts closer to that position you like to get by the constraint.
W niektórych przypadkach solver potrzebuje tylko lepszych wartości początkowych, aby rozwiązać powiązania. Weźmy na przykład przypadek, w którym masz część osi i część koła. Dodajesz wiązanie {{Variable|zbieżność Osi}} i nie otrzymujesz informacji, że solver zawiódł, ale części nie odpowiednio przesuwane, a w widżecie "Widok raportu" FreeCAD widzisz "''REACHED POS-ACCURACY :0.0''". Rozwiązaniem jest przesunięcie części bliżej pozycji, którą chcesz uzyskać za pomocą wiązania.


'''Note:''' Assure that at least one part of the constraint has the property {{PropertyData|fixed Position}} set to ''false''.
'''Uwaga:''' Upewnij się, że przynajmniej jedna część wiązania ma właściwość {{PropertyData|Pozycja ustalona}} ustawioną na {{false/pl}}.


<span id="Setting_the_Tip_Property"></span>
=== Setting the Tip Property ===
===Ustawienie właściwości Czubka===


If you miss some features of your part after the import to an A2plus assembly, check the property {{PropertyData|[[PartDesign_MoveTip|Tip]]}}.
Jeśli po zaimportowaniu do złożenia A2plus brakuje niektórych funkcji części, należy sprawdzić właściwość {{PropertyData|[[PartDesign_MoveTip/pl|Czubek]]}}.


A2plus imports bodies of parts with all their features up to the tip feature. This is sensible because setting the tip to a certain feature means that all features behind the tip should not appear in the final part. So if you miss a part feature in A2plus, open the part via the toolbar button [[Image:A2p EditPart.svg|24px]], then select a body and look at its property {{PropertyData|Tip}}. If the tip is not at the feature where you want it, right-click on the feature where the tip should be and choose {{MenuCommand|[[File:PartDesign_MoveTip.svg|24px]] Set tip}}. Finally save the part and reload the assembly using the toolbar button [[Image:A2p ImportPart_Update.svg|24px]].
Środowisko pracy A2plus importuje bryły części ze wszystkimi ich cechami do cechy Czukek. Jest to rozsądne, ponieważ ustawienie właściwości Czubek na określoną cechę oznacza, że wszystkie cechy za nim nie powinny pojawić się w gotowej części. Jeśli więc przegapisz cechę części w A2plus, otwórz część za pomocą przycisku paska narzędzi [[Image:A2p EditPart.svg|24px]], a następnie wybierz bryłę i spójrz na jej właściwość {{PropertyData|Czubek}}. Jeśli końcówka nie znajduje się w wybranym miejscu, kliknij prawym przyciskiem myszy w miejscu, w którym powinna się znajdować i wybierz {{MenuCommand|[[File:PartDesign_MoveTip.svg|24px]] Ustaw czubek}}. Na koniec zapisz część i przeładuj złożenie za pomocą przycisku na pasku narzędzi [[Image:A2p ImportPart_Update.svg|24px]].


<span id="Repairing_Assembly_Tree"></span>
=== Repairing Assembly Tree ===
===Naprawa drzewa montażu===


If you cannot see a clear reason why some constraints cannot be resolved, you can try to use the toolbar button [[Image:A2p RepairTree.svg|24px]]. This will resolve all constraints and re-group then again under the different parts.
Jeśli nie widzisz wyraźnego powodu, dla którego niektóre ograniczenia nie mogą zostać rozwiązane, możesz spróbować użyć przycisku paska narzędzi [[Image:A2p RepairTree.svg|24px]]. Spowoduje to rozwiązanie wszystkich wiązań i ponowne pogrupowanie ich pod różnymi częściami.


<span id="Migrating_old_A2plus_assemblies"></span>
=== Migrating old A2plus assemblies ===
===Migracja starych złożeń A2plus===


Assemblies created with A2plus older than March 2019 do not show the correct icons for imported parts and have obsolete properties. These assemblies can be migrated to A2plus version 0.4.35 and newer using the menu {{MenuCommand|A2plus → Misc → [[File:A2p_Upgrade.svg|24px]] Migrate proxies of imported parts}}. After doing this, you must save and reopen your assembly file.
Zespoły utworzone za pomocą środowiska A2plus starszego niż marzec 2019 r. nie wyświetlają prawidłowych ikon dla importowanych części i mają przestarzałe właściwości. Złożenia te można zmigrować do A2plus w wersji 0.4.35 i nowszej za pomocą opcji menu {{MenuCommand|A2plus → Misc → [[File:A2p_Upgrade.svg|24px]]. Migruj proxy zaimportowanych części}}. Po wykonaniu tej czynności należy zapisać i ponownie otworzyć plik złożenia.


<span id="Avoiding_Accented_Characters"></span>
=== Avoiding Accented Characters ===
===Unikanie znaków akcentowanych===


'''This strategy is not necessary for Windows.'''
'''Ta strategia nie jest konieczna dla systemu Windows.'''


W niektórych systemach operacyjnych mogą wystąpić problemy, jeśli nazwy plików lub ścieżki plików części lub zespołu zawierają znaki akcentowane. Dlatego należy unikać takich znaków, a także generalnie znaków specjalnych.
On some operating systems you can get problems if the file names or the file paths of parts or the assembly contain accented characters. Therefore avoid such characters and also special characters in general.


<span id="Fixing_Position"></span>
=== Fixing Position ===
===Pozycja ustalająca===


'''This strategy is no longer necessary for assemblies created with A2plus 0.3.11 or newer because A2plus issues now a warning for missing fixed positions.'''
'''Ta strategia nie jest już konieczna w przypadku złożeń utworzonych za pomocą A2plus 0.3.11 lub nowszej wersji, ponieważ A2plus wydaje teraz ostrzeżenie o braku ustalonych pozycji'''.


When you set a constraint between two parts and no part has the property {{PropertyData|fixed Position}} set to ''true'' or is connected by a constraint to a part with {{PropertyData|fixed Position}} set to ''true'', the constraint cannot be solved. The same happens if both parts of the constraint have {{PropertyData|fixed Position}} set to ''true''.
Po ustawieniu wiązania między dwiema częściami, gdy żadna część nie ma właściwości {{PropertyData|ustalona pozycja}} ustawionej na {{true/pl}} lub jest połączona wiązaniem z częścią z {{PropertyData|ustalona pozycja}} ustawioną na {{true/pl}}, wiązanie nie może zostać rozwiązane. To samo dzieje się, jeśli obie części wiązania mają {{PropertyData|fixed Position}} ustawione na {{true/pl}}.


Then A2plus outputs the info about the failed solution, but sometimes you only see that the parts are not moved accordingly and in the ''Report view'' widget of FreeCAD you see "''REACHED POS-ACCURACY :0.0''". This means the solver finished without errors but it could actually not solve the constraints.
Następnie A2plus wyświetla informacje o nieudanym rozwiązaniu, ale czasami widać tylko, że części nie zostały odpowiednio przesunięte, a w widżecie "Widok raportu" FreeCAD widać "''REACHED POS-ACCURACY :0.0''". Oznacza to, że solver zakończył pracę bez błędów, ale w rzeczywistości nie mógł rozwiązać wiązań.


Therefore check that at least one of your parts in the assembly has {{PropertyData|fixed Position}} set to ''true''. Then assure that you only set constraints to a part which is somehow connected to the fixed part. To visualise these dependencies, see section [[#Assembly_Structure|Assembly Structure]].
Dlatego sprawdź, czy przynajmniej jedna z części w złożeniu ma właściwość {{PropertyData|ustalona pozycja}} ustawioną na "true". Następnie upewnij się, że ustawiłeś ograniczenia tylko dla części, która jest w jakiś sposób połączona z częścią stałą. Aby zwizualizować te zależności, zobacz sekcję [[#Assembly_Structure/pl|Struktura złożenia]].


<span id="Rotating_Parts"></span>
===Obracanie części===
===Obracanie części===


'''Ta strategia nie jest już konieczna w przypadku złożeń utworzonych za pomocą środowiska pracy A2plus 0.4.0 lub nowszego, ponieważ A2plus automatycznie obraca części w tle, aby uzyskać wystarczający kąt początkowy dla solwera'''.
'''This strategy is no longer necessary for assemblies created with A2plus 0.4.0 or newer because A2plus rotates the parts now automatically a bit in the background to get a sufficient start angle for the solver.'''


The solver often fails for the constraint {{Variable|angledPlanes}} if the two selected planes have currently an angle ofor 180°. (The parts are not moved accordingly and in the ''Report view'' widget of FreeCAD you see "''REACHED POS-ACCURACY :0.0''".) A solution for this is to rotate one part by a few degrees using FreeCAD's transform feature (right-click on the part in the model tree and select in the context menu {{MenuCommand|Transform}}).
Solver często kończy się niepowodzeniem dla wiązania {{Variable|kątowePłaszczyzny}}, jeśli dwie wybrane płaszczyzny mają obecnie kątlub 180°. ''(Części nie odpowiednio przesuwane, a w widżecie "Widok raportu" programu FreeCAD wyświetlany jest komunikat "REACHED POS-ACCURACY :0.0")''. Rozwiązaniem tego problemu jest obrócenie jednej części o kilka stopni za pomocą funkcji transformacji FreeCAD ''(kliknij prawym przyciskiem myszy część w drzewie modelu i wybierz z menu kontekstowego {{MenuCommand|Przemieszczenie}})''.


'''Note:''' Assure that at least one part of the constraint has the property {{PropertyData|fixed Position}} set to ''false''.
'''Uwaga:''' Upewnij się, że przynajmniej jedna część wiązania ma właściwość {{PropertyData|Pozycja ustalona}} ustawioną na {{false/pl}}.


<span id="Animation"></span>
==Animacja==
==Animacja==


A2plus oferuje animacje za pomocą przeciągania oraz skryptów Pythona.
A2plus oferuje animacje za pomocą przeciągania oraz skryptów Pythona.


<span id="Dragging"></span>
===Przeciąganie===
===Przeciąganie===


Animacje przeciągania są interaktywne, ponieważ uruchamia się je poprzez przeciągnięcie części złożenia.
Dragging animations are interactive since you trigger it by dragging a part of the assembly.
Aby uzyskać tego rodzaju animacje:
To get these kind of animations:
# W pełni zwiąż część, której ruch lub obrót ma być animowany
# Fully constrain the part whose movement or rotation should be animated
# Click on the toolbar button [[Image:A2p MovePartUnderConstraints.svg|24px]]. This enables the dragging mode.
# Kliknij przycisk na pasku narzędzi [[Image:A2p MovePartUnderConstraints.svg|24px]]. Spowoduje to włączenie trybu przeciągania.
# Kliknij wybraną część w zespole.
# Click on the desired part in the assembly.
# Teraz możesz poruszać myszą, a część będzie podążać za ruchem myszy w ramach zdefiniowanych ograniczeń.
# Now you can move the mouse and the part will follow the movement of the mouse within the defined constraints.
# Aby zakończyć tryb przeciągania, kliknij lewym przyciskiem myszy w złożeniu lub naciśnij ESC.
# To end the dragging mode, left click in the assembly or press ESC.


Here is an example assembly to try out the dragging animation: [https://forum.freecadweb.org/download/file.php?id=99204 A2p_example-for-dragging-animation.FCStd]
Oto przykładowy zestaw do wypróbowania animacji przeciągania: [https://forum.freecadweb.org/download/file.php?id=99204 A2p_example-for-dragging-animation.FCStd].


[[Image:A2p_dragging-animation-result.gif]]
[[Image:A2p_dragging-animation-result.gif]]


{{Caption|Above: The dragging animation using the example assembly}}
{{Caption|Powyżej: Animacja przeciągania przy użyciu przykładowego złożenia.}}


=== Scripting ===
<span id="Scripting"></span>
===Tworzenie skryptów===


Pomimo tego, że tryb przeciągania oferuje ładne interaktywne animacje, czasami nie są one wystarczająco precyzyjne dla screencastów lub filmów. Animacje skryptowe mają tę zaletę, że animują ruchy i obroty w określony sposób. Można na przykład obrócić część o dokładnie 10° w przód i w tył. Poniższe przykłady wykorzystują złożenie, w którym część powinna zostać obrócona. Jeśli spróbujesz animować to za pomocą trybu przeciągania, zobaczysz, jak trudno jest uzyskać obrót w przód iw tył, który można np. pokazać szefowi w prezentacji. Dzięki interaktywnemu skryptowi przykładowemu jest to jednak łatwe zadanie.
Despite the dragging mode offers nice interactive animations, they are sometimes not precise enough for screencasts or videos. Scripted animations have the advantage that they animate movements and rotations in a defined way. You can for example rotate a part by exactly 10° back and forth. The following examples use an assembly where a part should be rotated. If you try to animate this using the dragging mode, you will see how hard it is to get a back and forth rotation that you can e.g. show your boss in a presentation. With the interactive example script, however, this is an easy task.


Animacja skryptowa działa zazwyczaj w ten sposób:
A scripted animation works usually this way:
# Zespół jest w pełni ograniczony
# The assembly is fully constrained
# Skrypt zmienia parametr, na przykład pozycję lub kąt obrotu części.
# The script changes a parameter, for example the position or rotation angle of a part
# Po zmianie parametru wiązania zespołu są rozwiązywane.
# After the parameter change, the assembly constraints are solved
# Step 2. and 3. are repeated to get the animation
# Kroki 2. i 3. powtarzane w celu uzyskania animacji.


Zamiast parametru rozmieszczenia można również zmienić ograniczenie, na przykład odległość między 2 płaszczyznami.
It is also possible to change instead of a placement parameter a constraint, for example the distance between 2 planes.


<span id="Simple_Script_Example"></span>
==== Simple Script Example ====
====Przykład prostego skryptu====


Najprostszym sposobem tworzenia skryptów animacji jest animacja nieinteraktywna, która podąża za zdefiniowanym ruchem. Oto przykład:
The simplest way to script an animation is a non-interactive animation that follows a defined movement. Here is an example:
First download this assembly file: [https://forum.freecadweb.org/download/file.php?id=97554 A2p_animated-example.FCStd] and also this Python script: [https://forum.freecadweb.org/download/file.php?id=97981 A2p_animation-example-script.py].
Najpierw pobierz ten plik złożenia: [https://forum.freecadweb.org/download/file.php?id=97554 A2p_animated-example.FCStd], a także ten skrypt Python: [https://forum.freecadweb.org/download/file.php?id=97981 A2p_animation-example-script.py].


<div class="mw-collapsible mw-collapsed toccolours">
<div class="mw-collapsible mw-collapsed toccolours">
Jest to zawartość skryptu, a linie zaczynające się od "#" opisują, co robią poszczególne linie skryptu:
This is the content of the script and the lines beginning with a '#' describe what the different script lines do:
<div class="mw-collapsible-content">
<div class="mw-collapsible-content">
{{Code|code=
{{Code|code=
# import libraries
# import bibliotek
import time, math, PySide
import time, math, PySide
import A2plus.a2p_solversystem as a2p_solver
import A2plus.a2p_solversystem as a2p_solver


# używamy kroków co 1 stopień
# we use steps of 1 degree
step = 1
step = 1
# wait 1 ms between every step
# odczekaj 1 ms między każdym krokiem
timeout = 0.001
timeout = 0.001
# początkowy kąt wynosi 0 stopni
# initial angle is 0 degree
angle = 0
angle = 0
# bierzemy aktualnie otwarty dokument
# we take the currently opened document
document = FreeCAD.activeDocument()
document = FreeCAD.activeDocument()
# we want later change the rotation angle of the part "star_wheel_001"
# chcemy później zmienić kąt obrotu części "star_wheel_001"
starWheel = document.getObject("star_wheel_001")
starWheel = document.getObject("star_wheel_001")
# define a progress dialog running from 0 to 360
# zdefiniuj okno dialogowe postępu działające od 0 do 360
progressDialog = PySide.QtGui.QProgressDialog(u"Animation progress", u"Stop", 0, 360)
progressDialog = PySide.QtGui.QProgressDialog(u " Animation progress", u " Stop", 0, 360)


# blok while jest główną pętlą zmieniającą kąt i rozwiązującą
# the while block is the main loop to change the angle and solve
# ograniczenia montażowe następnie
# the assembly constraints subsequently
while angle < 360: # run this loop until we have one full turn (360 degrees)
while angle < 360: # wykonuj pętlę, uzyskamy jeden pełny obrót (360 stopni)
# increase the rotation angle
# zwiększyć kąt obrotu
angle += step
angle += step
# ustaw nowy kąt w oknie dialogowym postępu
# set the new angle to the progress dialog
progressDialog.setValue(angle)
progressDialog.setValue(angle)
# change the rotation angle of the part "star_wheel_001"
# zmień kąt obrotu części "star_wheel_001"
starWheel.Placement.Rotation.Angle = math.radians(angle)
starWheel.Placement.Rotation.Angle = math.radians(angle)
# solve the constraints
# rozwiąż ograniczenia
a2p_solver.solveConstraints(document, useTransaction=True)
a2p_solver.solveConstraints(document, useTransaction=True)
# zaktualizuj widok po rozwiązaniu ("Gui" oznacza "graficzny interfejs użytkownika")
# update the view after the solving ('Gui' stands for 'graphical user interface')
FreeCADGui.updateGui()
FreeCADGui.updateGui()
# bring the progress dialog to front
# przenieś okno dialogowe postępu na przód
PySide.QtGui.QWidget.raise_(progressDialog)
PySide.QtGui.QWidget.raise_(progressDialog)
# jeśli w oknie dialogowym naciśnięto "Stop", wyjdź z pętli
# if 'Stop' was pressed in the dialog, exit the loop
if progressDialog.wasCanceled():
if progressDialog.wasCanceled():
angle = 360
angle = 360
# odczekaj jakiś czas przed wykonaniem następnego kroku
# wait some time before performing the next step
time.sleep(timeout)
time.sleep(timeout)
}}
}}
Line 381: Line 432:
</div>
</div>


Aby użyć skryptu do wykonania animacji, musimy
To use the script to perform the animation, we must
# Open the assembly file in FreeCAD.
# Otworzyć plik złożenia w programie FreeCAD.
# Open the script file in FreeCAD.
# Otworzyć plik skryptu w programie FreeCAD.
# Click on the toolbar button [[Image:Menu_Std_DlgMacroExecute_fr_02.png|24px]] to execute the script (also called macro).
# Kliknąć przycisk paska narzędzi [[Image:Menu_Std_DlgMacroExecute_fr_02.png|24px]], aby wykonać skrypt ''(zwany również makrem)''.
# Przejdź do zakładki zespołu, aby zobaczyć obrót.
# Change to the tab of the assembly to see the rotation.


Aby poćwiczyć, po prostu zmień coś w skrypcie i wykonaj go później. Na przykład zwiększyć "krok" do "5".
To practice, just change something in the script and execute it afterwards. For example increase ''step'' to ''5''.


Oto wynik przykładowej animacji:
This is the result of the example animation:


[[Image:A2p animated-example-result.gif]]
[[Image:A2p animated-example-result.gif]]


<span id="Interactive_Script_Example"></span>
==== Interactive Script Example ====
====Przykład interaktywnego skryptu====


Pierwszy przykład skryptu pokazał, jak utworzyć animację bez żadnej informacji zwrotnej od użytkownika. W przypadku większości aplikacji konieczna jest interakcja z animacją. Na przykład interesującą kwestią w tym przykładzie jest zobaczenie, jak szpilki napędowe przecinają środkowy rowek koła. Aby przyjrzeć się temu bliżej, można zaprezentować ten szczegół współpracownikom lub szefowi. Dlatego potrzebne jest interaktywne rozwiązanie.
The first script example demonstrated how to create an animation without any user feedback. For most applications you need to interact with the animation. For example the interesting issue in the example is to see how the driving pins cross the center groove of the wheel. To have a closer look you might present this detail to your colleagues or boss. Therefore you need an interactive solution.


Można to zrobić za pomocą niestandardowego okna dialogowego animacji z suwakiem. Przesuwając suwak można ustawić kąt obrotu, a tym samym obracać się tam i z powrotem w interesującej pozycji.
This can be done by using a custom animation dialog with a slider. By moving the slider you can set the rotation angle and therefore rotate back and forth at interesting position.


We use the same assembly file: [https://forum.freecadweb.org/download/file.php?id=97554 A2p_animated-example.FCStd] and this Python script: [https://forum.freecadweb.org/download/file.php?id=97982 A2p_animation-example-script.py].
Używamy tego samego pliku asemblera: [https://forum.freecadweb.org/download/file.php?id=97554 A2p_animated-example.FCStd] i tego skryptu Pythona: [https://forum.freecadweb.org/download/file.php?id=97982 A2p_animation-example-script.py].


<div class="mw-collapsible mw-collapsed toccolours">
<div class="mw-collapsible mw-collapsed toccolours">
Jest to treść skryptu, który wyświetla interaktywne okno dialogowe animacji:
This is the content of the script to get the interactive animation dialog:
<div class="mw-collapsible-content">
<div class="mw-collapsible-content">
{{Code|code=
{{Code|code=
# import libraries
# import bibliotek
import time, math, PySide, sys
import time, math, PySide, sys
import FreeCAD.A2plus.a2p_solversystem as a2p_solver
import FreeCAD.A2plus.a2p_solversystem as a2p_solver
Line 411: Line 463:
from PySide import QtCore, QtGui
from PySide import QtCore, QtGui


# wait 1 ms after every calculation
# odczekać 1 ms po każdym obliczeniu
timeout = 0.001
timeout = 0.001
# pobieramy aktualnie otwarty dokument
# we take the currently opened document
document = FreeCAD.activeDocument()
document = FreeCAD.activeDocument()
# we want later change the rotation angle of the part "star_wheel_001"
# chcemy później zmienić kąt obrotu części "star_wheel_001"
starWheel = document.getObject("star_wheel_001")
starWheel = document.getObject("star_wheel_001")


class AnimationDlg(QtGui.QWidget): # the animation dialog
class AnimationDlg(QtGui.QWidget): # okno dialogowe animacji


def __init__(self): # to initialize the dialog
def __init__(self): # to initialize the dialog
Line 424: Line 476:
self.initUI()
self.initUI()


def initUI(self): # the definition of the dialog components
def initUI(self): # definicja komponentów okna dialogowego
self.setMinimumSize(self.minimumSizeHint()) # set the minimal dialog size to minimum
self.setMinimumSize(self.minimumSizeHint()) # set the minimal dialog size to minimum
self.setWindowTitle('Animation Dialog')
self.setWindowTitle('Animation Dialog')
# use a grid layout for the whole form
# używać układu siatki dla całego formularza
self.mainLayout = QtGui.QGridLayout()
self.mainLayout = QtGui.QGridLayout()
self.lineNo = 0 # first dialog grid line
self.lineNo = 0 # first dialog grid line
# add description label
# Dodaj etykietę opisu
DescriptionLabel = QtGui.QLabel(self)
DescriptionLabel = QtGui.QLabel(self)
DescriptionLabel.setText("Change slider to change rotation angle")
DescriptionLabel.setText("Change slider to change rotation angle")
self.mainLayout.addWidget(DescriptionLabel,self.lineNo,0,1,4)
self.mainLayout.addWidget(DescriptionLabel,self.lineNo,0,1,4)
# next dialog grid line
# następny wiersz okna dialogowego
self.lineNo += 1
self.lineNo += 1
# add a label; there is no need for the "self." prefix because we don't want to change the label later
# dodaje etykietę; nie ma potrzeby stosowania przedrostka "self.", ponieważ nie chcemy później zmieniać etykiety.
LabelMin = QtGui.QLabel(self)
LabelMin = QtGui.QLabel(self)
LabelMin.setText("Min")
LabelMin.setText("Min")
LabelMin.setFixedHeight(32)
LabelMin.setFixedHeight(32)
self.mainLayout.addWidget(LabelMin,self.lineNo,0)
self.mainLayout.addWidget(LabelMin,self.lineNo,0)
# dodać edycję obrotową, aby zdefiniować minimum suwaka
# add a spin edit to define the slider minimum
self.MinEdit = QtGui.QSpinBox(self)
self.MinEdit = QtGui.QSpinBox(self)
# get the angle unit as string
# pobiera jednostkę kąta jako ciąg znaków
self.MinEdit.setSuffix(" " + str(FreeCAD.Units.Quantity(1, FreeCAD.Units.Angle))[2:])
self.MinEdit.setSuffix(" " + str(FreeCAD.Units.Quantity(1, FreeCAD.Units.Angle))[2:])
self.MinEdit.setMaximum(999)
self.MinEdit.setMaximum(999)
Line 453: Line 505:
QtCore.QObject.connect(self.MinEdit, QtCore.SIGNAL("valueChanged(int)"), self.setMinEdit)
QtCore.QObject.connect(self.MinEdit, QtCore.SIGNAL("valueChanged(int)"), self.setMinEdit)
self.mainLayout.addWidget(self.MinEdit,self.lineNo,1)
self.mainLayout.addWidget(self.MinEdit,self.lineNo,1)
# add the slider
# dodaj suwak
self.slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
self.slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
self.slider.setRange(0, 360)
self.slider.setRange(0, 360)
Line 461: Line 513:
QtCore.QObject.connect(self.slider, QtCore.SIGNAL("sliderMoved(int)"), self.handleSliderValue)
QtCore.QObject.connect(self.slider, QtCore.SIGNAL("sliderMoved(int)"), self.handleSliderValue)
self.mainLayout.addWidget(self.slider,self.lineNo,2)
self.mainLayout.addWidget(self.slider,self.lineNo,2)
# add a label
# dodaj etykietę
LabelMax = QtGui.QLabel(self)
LabelMax = QtGui.QLabel(self)
LabelMax.setText("Max")
LabelMax.setText("Max")
LabelMax.setFixedHeight(32)
LabelMax.setFixedHeight(32)
self.mainLayout.addWidget(LabelMax,self.lineNo,3)
self.mainLayout.addWidget(LabelMax,self.lineNo,3)
# dodaje edycję obrotową, aby zdefiniować maksimum suwaka
# add a spin edit to define the slider maximum
self.MaxEdit = QtGui.QSpinBox(self)
self.MaxEdit = QtGui.QSpinBox(self)
# get the angle unit as string
# pobiera jednostkę kąta jako ciąg znaków
self.MaxEdit.setSuffix(" " + str(FreeCAD.Units.Quantity(1, FreeCAD.Units.Angle))[2:])
self.MaxEdit.setSuffix(" " + str(FreeCAD.Units.Quantity(1, FreeCAD.Units.Angle))[2:])
self.MaxEdit.setMaximum(999)
self.MaxEdit.setMaximum(999)
Line 478: Line 530:
QtCore.QObject.connect(self.MaxEdit, QtCore.SIGNAL("valueChanged(int)"), self.setMaxEdit)
QtCore.QObject.connect(self.MaxEdit, QtCore.SIGNAL("valueChanged(int)"), self.setMaxEdit)
self.mainLayout.addWidget(self.MaxEdit,self.lineNo,4)
self.mainLayout.addWidget(self.MaxEdit,self.lineNo,4)
# next dialog grid line
# następny wiersz okna dialogowego
self.lineNo += 1
self.lineNo += 1
# add a spacer
# dodaje element dystansowy
self.mainLayout.addItem(QtGui.QSpacerItem(10,10), 0, 0)
self.mainLayout.addItem(QtGui.QSpacerItem(10,10), 0, 0)
# add a label
# dodaje etykietę
LabelCurrent = QtGui.QLabel(self)
LabelCurrent = QtGui.QLabel(self)
LabelCurrent.setText("Current angle:")
LabelCurrent.setText("Current angle:")
LabelCurrent.setFixedHeight(32)
LabelCurrent.setFixedHeight(32)
self.mainLayout.addWidget(LabelCurrent,self.lineNo,1)
self.mainLayout.addWidget(LabelCurrent,self.lineNo,1)
# output the current angle
# wyświetla bieżący kąt
self.CurrentAngle = QtGui.QLineEdit(self)
self.CurrentAngle = QtGui.QLineEdit(self)
self.CurrentAngle.setText(str(0))
self.CurrentAngle.setText(str(0))
Line 494: Line 546:
self.CurrentAngle.isReadOnly()
self.CurrentAngle.isReadOnly()
self.mainLayout.addWidget(self.CurrentAngle,self.lineNo,2)
self.mainLayout.addWidget(self.CurrentAngle,self.lineNo,2)
# add label for the unit
# dodaje etykietę dla urządzenia
LabelUnit = QtGui.QLabel(self)
LabelUnit = QtGui.QLabel(self)
LabelUnit.setText("deg")
LabelUnit.setText("deg")
LabelUnit.setFixedHeight(32)
LabelUnit.setFixedHeight(32)
self.mainLayout.addWidget(LabelUnit,self.lineNo,3)
self.mainLayout.addWidget(LabelUnit,self.lineNo,3)
# button to close the dialog
# aby zamknąć okno dialogowe
self.Close = QtGui.QPushButton(self)
self.Close = QtGui.QPushButton(self)
self.Close.setText("Close")
self.Close.setText("Close")
Line 511: Line 563:


def handleSliderValue(self):
def handleSliderValue(self):
# set slider value as angle
# ustawia wartość suwaka jako kąt
starWheel.Placement.Rotation.Angle = math.radians(self.slider.value())
starWheel.Placement.Rotation.Angle = math.radians(self.slider.value())
# output current angle
# kąt prądu wyjściowego
self.CurrentAngle.setText(str(self.slider.value()))
self.CurrentAngle.setText(str(self.slider.value()))
# solve the constraints
# rozwiązywanie wiązań
a2p_solver.solveConstraints(document)
a2p_solver.solveConstraints(document)
# update the view after the solving ('Gui' stands for 'graphical user interface')
# aktualizacja widoku po rozwiązaniu ''("Gui" oznacza "graficzny interfejs użytkownika")''
FreeCADGui.updateGui()
FreeCADGui.updateGui()
# wait some time, important to give time to perform calculations
# odczekaj trochę czasu, ważne jest, aby dać czas na wykonanie obliczeń.
time.sleep(timeout)
time.sleep(timeout)


def setMinEdit(self):
def setMinEdit(self):
# assure that the minimum is samller than the maximum
# upewnij się, że minimum jest mniejsze niż maksimum
if self.MinEdit.value() >= self.MaxEdit.value():
if self.MinEdit.value() >= self.MaxEdit.value():
self.MaxEdit.setValue(self.MinEdit.value() + 1)
self.MaxEdit.setValue(self.MinEdit.value() + 1)
Line 529: Line 581:


def setMaxEdit(self):
def setMaxEdit(self):
# assure that the minimum is samller than the maximum
# upewnić się, że minimum jest mniejsze niż maksimum
if self.MinEdit.value() >= self.MaxEdit.value():
if self.MinEdit.value() >= self.MaxEdit.value():
self.MinEdit.setValue(self.MaxEdit.value() - 1)
self.MinEdit.setValue(self.MaxEdit.value() - 1)
Line 537: Line 589:
AnimationDialog.close()
AnimationDialog.close()


# utwórz i wyświetl zdefiniowane okno dialogowe
# create and show the defined dialog
AnimationDialog = AnimationDlg()
AnimationDialog = AnimationDlg()
AnimationDialog.show()
AnimationDialog.show()


# uruchom tę pętlę, gdy okno dialogowe jest widoczne
# run this loop when the dialog is visible
while AnimationDialog.isVisible():
while AnimationDialog.isVisible():
# aktualizacja widoku; ważne, aby system operacyjny otrzymał informację zwrotną, że okno dialogowe jest aktywne
# update the view; important to give the OS feedback the dialog is alive
FreeCADGui.updateGui()
FreeCADGui.updateGui()
# przeniesienie okna dialogowego na przód, tak aby było ono zawsze widoczne
# bring the dialog to front, so that the dialog is always visible
QtGui.QWidget.raise_(AnimationDialog)
QtGui.QWidget.raise_(AnimationDialog)
# wartość wyjściowa suwaka również tutaj, ponieważ podczas obliczeń suwak mógł zostać przesunięty
# output slider value here too because during the calculation the slider might have been moved
AnimationDialog.CurrentAngle.setText(str(AnimationDialog.slider.value()))
AnimationDialog.CurrentAngle.setText(str(AnimationDialog.slider.value()))
}}
}}
Line 553: Line 605:
</div>
</div>


Okno dialogowe zdefiniowane w skrypcie wygląda następująco:
The dialog defined in the script looks like this:


[[Image:A2p_AnimationDialog.png]]
[[Image:A2p_AnimationDialog.png]]


<span id="Script_Commands"></span>
=== Script Commands ===
===Polecenia skryptu===


Aby lepiej zrozumieć składnię skryptu, oto kilka informacji o poleceniach:
To understand the script syntax better, here is some command info:
{{Code|code= starWheel.Placement.Rotation.Angle = math.radians(angle)}}
{{Code|code= starWheel.Placement.Rotation.Angle = math.radians(angle)}}


Here we change the placement property {{incode|Rotation.Angle}} of the part get got previously as {{incode|starWheel}}. This property gets the angle as [https://en.wikipedia.org/wiki/Radian radian]. The function {{incode|radians()}} from the library {{incode|math}} converts the angle from degree to radian.
Tutaj zmieniamy właściwość umieszczania {{incode|Rotation.Angle}} części otrzymanej wcześniej jako {{incode|starWheel}}. Ta właściwość pobiera kąt jako [https://en.wikipedia.org/wiki/Radian radian]. Funkcja {{incode|radians()}} z biblioteki {{incode|math}} konwertuje kąt ze stopni na radiany.


The property {{incode|Rotation.Angle}} uses the current placement axis of the part (in our example the X-axis). To rotate the part e.g. around the Z-axis one can set the rotation axis (before calling the rotation command) using the command:
Właściwość {{incode|Rotation.Angle}} wykorzystuje bieżącą umieszczenia części ''(w naszym przykładzie X)''. Aby obrócić część np. wokół osi Z, można ustawić obrotu ''(przed wywołaniem polecenia obrotu)'' za pomocą polecenia:
{{Code|code= starWheel.Placement.Rotation.Axis = FreeCAD.Vector(0,0,1)}}
{{Code|code= starWheel.Placement.Rotation.Axis = FreeCAD.Vector(0,0,1)}}
Zamiast obracać, części można również przesuwać. Aby zmienić na przykład położenie koła w kierunku Y, polecenie brzmiałoby:
Instead of rotating, parts can also be moved. To change for example the placement in Y-direction of the wheel, the command would be:
{{Code|code= starWheel.Placement.Base.y = PositionShift}}
{{Code|code= starWheel.Placement.Base.y = PositionShift}}
In this case we would not define the variable {{incode|angle}} but {{incode|PositionShift}} that we change on every loop run.
W tym przypadku nie definiowalibyśmy zmiennej {{incode|angle}}, ale {{incode|PositionShift}}, którą zmieniamy przy każdym przebiegu pętli.


Istnieją różne sposoby ustawiania położenia części. Niektóre z nich są udokumentowane na stronie [[Placement/pl|Umiejscowienie]]. Niestety nie ma ''(jeszcze)'' listy wszystkich możliwych poleceń umiejscowienia.
There are different ways to set the placement of a part. Some are [[Placement| documented here]]. Unfortunately there is no list (yet) with all possible placement commands.
{{Code|code=a2p_solver.solveConstraints(document, useTransaction=False/True)}}
{{Code|code=a2p_solver.solveConstraints(document, useTransaction=False/True)}}


This is an A2plus-specific command. It solves the assembly constraints of the assembly we previously got as {{incode|document}}. The option {{incode|useTransaction}} specifies if FreeCAD should store every change in the undo/redo stack. For large animations you might therefore set it to {{FALSE}}.
Jest to polecenie specyficzne dla środowiska pracy A2plus. Rozwiązuje ono wiązania złożenia, które wcześniej otrzymaliśmy jako {{incode|document}}. Opcja {{incode|useTransaction}} określa, czy FreeCAD powinien przechowywać każdą zmianę w stosie cofania / ponawiania. W przypadku dużych animacji można więc ustawić na {{FALSE}}.


{{Userdocnavi{{#translation:}}}}
{{Userdocnavi{{#translation:}}}}

Latest revision as of 12:06, 12 January 2024

Ikonka FreeCAD dla środowiska pracy A2plus

Wprowadzenie

Środowisko pracy A2plus to zewnętrzne środowisko do wykonywania złożeń różnych części w programie FreeCAD.

Niniejsza dokumentacja opisuje wersję A2plus 0.4.56 lub nowszą.

Instalacja

Środowisko pracy A2plus jest dodatkiem do programu FreeCAD. Można je łatwo zainstalować za pomocą Menadżera dodatków z menu Przybory → Menadżer dodatków. A2plus jest w trakcie aktywnego rozwoju i będzie często wzbogacany o nowe funkcje. Dlatego warto go regularnie aktualizować, również za pomocą narzędzia w menu Przybory → Menadżer dodatków. Kod A2plus jest przechowywany i rozwijany na GitHub i może być również zainstalowany ręcznie poprzez skopiowanie go do katalogu Mod programu FreeCAD.

Rozpoczęcie pracy

Na początku przejdź do paska narzędzi A2plus w programie FreeCAD. Aby utworzyć złożenie, utwórz nowy plik w programie FreeCAD. Na początku plik ten musi zostać zapisany. Zaleca się (ale nie jest to konieczne), aby zapisać go w tym samym folderze, w którym znajdują się części, z których ma zostać wykonany montaż.

Teraz części można dodawać do złożenia za pomocą przycisku na pasku narzędzi lub . Przycisk dodaje wszystkie bryły w wybranym pliku jako jedną część. Używając przycisku możesz wybrać, jaki element z pliku ma zostać zaimportowany jako część. W ten sposób można na przykład zaimportować tylko szkic, a następnie złożyć kolejne części, używając szkicu do określenia pozycji części.

Pierwsza dodana część otrzymuje domyślnie stałą pozycję. (Można to zmienić później za pomocą właściwości części DANEfixed Position).

Części, które już znajdują się w złożeniu, można klonować za pomocą przycisku z paska narzędzi .

Aby edytować część ze złożenia, zaznacz ją w drzewie modelu i użyj przycisku na pasku narzędzi . Spowoduje to otwarcie części w nowej zakładce w programie FreeCAD lub przełączenie do jej zakładki, jeśli plik jest już otwarty.

Aby zaktualizować części zmodyfikowane w złożeniach kliknij na przycisk na pasku narzędzi . Przycisk paska narzędzi również importuje części, ale rekurencyjnie przez możliwe montaż podzespołów. Jeśli zaznaczysz jedną lub kilka części w widoku drzewa programu FreeCAD, A2plus poprosi Cię o aktualizację tylko wybranych części.

Zaimportowane części zachowują swoje zewnętrzne zależności i można je edytować. W przypadku ściśle zdefiniowanych części, takich jak śruby, warto jednak, aby ich kształt nie mógł być edytowany. Można to osiągnąć za pomocą przycisku na pasku narzędzi , który przekształca wybraną część w statyczną kopię części oryginalnej.

Aby zapisać złożenie i zamknąć je po zakończeniu, można użyć przycisku paska narzędzi .

Przełączanie przycisku paska narzędzi ustawia sposób, zaznaczenia kilku krawędzi, ścian itp.: albo za pomocą pojedynczego kliknięcia, albo używając Ctrl + kliknięcie.

Montaż

Montaż części odbywa się poprzez dodawanie więzów pomiędzy częściami. Po wprowadzeniu wiązania środowisko pracy A2plus przesuwa części zgodnie z wiązaniem, jeśli jest to możliwe.

Aby utworzyć wiązanie między częściami, przytrzymaj wciśnięty klawisz Ctrl i zaznacz każdą krawędź lub powierzchnię dwóch części. Następnie kliknij przycisk na pasku narzędziowym żądanego wiązania. Pojawi się okno dialogowe opisane w rozdziale wiązania. Wiązanie zostanie dodane do drzewa modelu dołączonego do części, których dotyczy.

W przypadku złożonych wiązań między częściami środowisko pracy A2plus może nie wykonać rozwiązania wiązań. W związku z tym zapoznaj się również z punktem Rozwiązywanie problemów, aby poznać strategie rozwiązywania takich przypadków.

Bieżące monitorowanie

Im więcej części dodajesz, tym ważniejsze jest, aby je śledzić. Dlatego A2plus oferuje narzędzia do przenoszenia i przeglądania części:

  • Aby przesunąć część w złożeniu, zaznacz ją w drzewie modelu i użyj przycisku na pasku narzędzi . Gdy umieścisz część tam, gdzie chcesz, kliknij lewym przyciskiem myszy. Jeśli przeniesiona część ma już wiązania, zostanie ona odpowiednio umieszczona po naciśnięciu przycisku paska narzędzi , ponieważ powoduje to rozwiązanie wszystkich więzów złożenia.
  • Aby pokazać wiązanie, wybierz je w drzewie modelu i użyj przycisku na pasku narzędzi . Spowoduje to, że cały zespół stanie się przezroczysty i zostaną podświetlone dwa obiekty, które są połączone wiązaniem. Aby powrócić do normalnego widoku, kliknij lewym przyciskiem myszki na złożeniu.
  • Aby pokazać tylko niektóre części złożenia, wybierz te części w drzewie modelu i użyj przycisku paska narzędzi . Alternatywnie możesz ukryć określoną część, zaznaczając ją w drzewie modelu i naciskając klawisz Spacja, aby przełączyć jej widoczność.
  • Aby przełączyć widok przezroczystości całego złożenia, możesz użyć przycisku na pasku narzędzi .
  • Każdą część można uczynić przezroczystą za pomocą normalnej edycji w programie FreeCAD. Jednak czasami ustawienie przezroczystości dla części jest tracone przy ponownym otwieraniu złożenia z powodu błędu w programie FreeCAD. Jako obejście tego problemu możesz użyć przycisku paska narzędzi , aby przywrócić ustawienia przezroczystości.

Wiązania

Podczas tworzenia wiązania takie okno dialogowe zostanie wyświetlone po naciśnięciu przycisku paska narzędziowego wiązania:

Powyżej: Okno dialogowe właściwości wiązań A2plus

W przypadku niektórych wiązań można modyfikować kierunek wiązania. Za pomocą przycisku Rozwiąż można wcześniej sprawdzić, czy to nowe wiązanie może być rozwiązane przez A2plus. Jeśli nie, zajrzyj do rozdziału Rozwiązywanie problemów.

Wiązania można wyłączyć, zmieniając ich widzialność. Robi się to przez wybranie wiązania w widoku drzewa i naciśnięcie klawisza Spacja. Powoduje to włączenie właściwości DANEStłumione. Wyciszone wiązanie nie jest brane pod uwagę podczas rozwiązywania zespołu.

A2plus zapewnia następujące wiązania:

Punkt w punkcie

Wybierz wierzchołek (punkt), okrąg lub sferę na każdej części. Jeśli wybrano okrąg lub sferę, to jej punkt środkowy zostanie użyty w Wiązaniu. Przycisk na pasku narzędzi dodaje wiązanie PunktIdentyfikacja, które sprawia, że wierzchołki są zbieżne.

Punkt na linii

Wybierz wierzchołek (punkt), lub okrągłą krawędź (wybierze jej punkt środkowy), lub kulistą ścinę (również wybierze jej punkt środkowy) na jednej części i krawędź na drugiej. Przycisk paska narzędzi dodaje wiązanie PunktNaLinii. Spowoduje ono umieszczenie wierzchołka na krawędzi.

Punkt na płaszczyźnie

Wybierz wierzchołek (punkt), okrągłą krawędź (zostanie wybrany jej punkt środkowy) lub kulistą ścianę (również zostanie wybrany jej punkt środkowy) na jednej części i płaszczyznę na drugiej części. Przycisk paska narzędzi dodaje wiązanie Punkt na płaszczyźnie. W oknie dialogowym wiązania można określić przesunięcie między punktem a płaszczyzną. Przesunięcie to można również przerzucić między obiema stronami płaszczyzny. Jeśli przesunięcie wynosi zero, ograniczenie spowoduje umieszczenie wierzchołka na płaszczyźnie.

Sfera w sferze

Wybierz sferyczną powierzchnię lub wierzchołek (punkt) na obu częściach. Przycisk na pasku narzędzi dodaje wiązanie sphereCenterIdent (sfera o wspólnym środku). Sprawi ono, że środki sfer, środki sfery i wierzchołka lub wierzchołki będą się pokrywać.

Okrągła krawędź na okrągłej krawędzi

Wybierz okrągłą krawędź krawędź na obu częściach. Przycisk na pasku narzędzi dodaje wiązanie circularEdge. W oknie dialogowym wiązania można określić przesunięcie między krawędziami. To przesunięcie może być również odwrócone. Ponadto można ustawić kierunek wiązania i zablokować obrót części. Jeśli przesunięcie wynosi zero, wiązanie spowoduje, że krawędzie będą koncentrycznie leżeć w tej samej płaszczyźnie.

Zbieżność osi

Wybierz cylindryczną Powierzchnię lub liniową Krawędź na obu częściach. Przycisk na pasku narzędzi dodaje wiązanie Zbieżność osi. W oknie dialogowym wiązania można określić kierunek osi. W oknie tym można również zablokować obrót części. Wiązanie spowoduje, że osie lub linie będą zbieżne.

Równoległość osi

Wybierz cylindryczną powierzchnię lub liniową krawędź na obu częściach. Przycisk na pasku narzędzi dodaje wiązanie równoległości osi. W oknie dialogowym ograniczenia można określić kierunek osi. Ograniczenie sprawi, że osie lub linie będą równoległe.

Oś na płaszczyźnie równoległej

Wybierz cylindryczną powierzchnię lub liniową krawędź na jednej części i płaszczyznę na drugiej części. Przycisk paska narzędzi dodaje wiązanie Oś na płaszczyźnie równoległej. Dzięki temu wiązaniu oś lub prosta będzie równoległa do płaszczyzny.

Oś na płaszczyźnie normalnej

Wybierz cylindryczną powierzchnię lub liniową krawędź na jednej części i płaszczyznę na drugiej części. Przycisk paska narzędzi dodaje wiązanie Oś na płaszczyźnie normalnej. Wiązanie spowoduje, że oś lub linia będzie normalna do płaszczyzny.

Kąt osi na płaszczyźnie

Wybierz cylindryczną powierzchnię lub liniową krawędź na jednej części i płaszczyznę na drugiej części. Przycisk paska narzędzi dodaje wiązanie axisPlaneAngleAngle. Początkowo wiązanie sprawi, że oś będzie równoległa do płaszczyzny. Następnie można dostosować kąt dla osi w pojawiającym się oknie dialogowym ustawień wiązania.

Równoległe płaszczyzny

Zaznacz płaszczyznę na obu częściach. Przycisk na pasku narzędzi dodaje wiązanie RównoległePłaszczyzny. W oknie dialogowym wiązania można określić kierunek wiązania. Użycie tego wiązania spowoduje, że płaszczyzny będą równoległe.

Płaszczyzna na płaszczyźnie

Wybierz płaszczyznę na obu częściach. Przycisk na pasku narzędzi dodaje wiązanie Zbieżność płaszczyzn. Okno dialogowe wiązania pozwala określić kierunek wiązania i przesunięcie między płaszczyznami. Przesunięcie to może być również odwrócone. Jeśli przesunięcie wynosi zero, wiązanie spowoduje, że płaszczyzny będą się pokrywać.

Płaszczyzna kątowa

Wybierz płaszczyznę na obu częściach. Przycisk paska narzędzi dodaje wiązanie angledPlanes. Okno dialogowe wiązania pozwala określić kąt między płaszczyznami. Wiązanie sprawi, że płaszczyzny będą najpierw równoległe, a następnie ustawi określony kąt.

Zbieżność w środku masy

Wybierz zamkniętą krawędź lub płaszczyznę na obu częściach. Przycisk paska narzędzi dodaje ograniczenie centerOfMass. Okno dialogowe wiązania pozwala określić przesunięcie między krawędziami lub płaszczyznami. Przesunięcie to można również odwrócić. Ponadto można ustawić kierunek wiązania i zablokować obrót części. Jeśli przesunięcie wynosi zero, wiązanie umieści krawędzie lub płaszczyzny w tej samej płaszczyźnie.

Montaż podzespołów

Złożenie może zawierać inne złożenia. Dodaje się je jak części, naciskając przycisk paska narzędzi i wybierając plik *.FCStd zawierający zespół. Takie podzespoły mogą być również edytowane jak części za pomocą przycisku paska narzędzi . W przypadku wyższych etapów montażu należy upewnić się, że zespół został zaktualizowany rekursywnie za pomocą przycisku paska narzędzi po wprowadzeniu zmian.

Operowanie wiązaniami

Możliwe wiązania dla zaznaczenia są wyświetlane na pasku narzędzi i w oknie dialogowym Narzędzia wiązań poprzez włączenie odpowiednich przycisków. Okno dialogowe Narzędzia wiązań jest otwierane za pomocą przycisku na pasku narzędzi . Powinno ono pozostać otwarte, aby móc szybko dodać kilka wiązań do zespołu.

Istniejące wiązania mogą być edytowane poprzez zaznaczenie ich w drzewie modelu, a następnie dwukrotne kliknięcie na nie lub użycie przycisku na pasku narzędzi . Umożliwi to otwarcie okna dialogowego Właściwości wiązania.

Wiązania można tymczasowo wyciszyć, zaznaczając je w drzewie modelu i zmieniając właściwość elementu drzewa DANEStłumione.

Wiązania mogą zostać usunięte poprzez zaznaczenie ich w drzewie modelu i naciśnięcie przycisku Del lub poprzez zaznaczenie części z wiązaniami w drzewie modelu i użycie przycisku paska narzędzi .

Wszystkie wiązania mogą być rozwiązane w dowolnym momencie za pomocą przycisku paska narzędzi . Jeśli przycisk paska narzędzi jest włączony, rozwiązanie jest wykonywane automatycznie po każdej edycji wiązania.

Przycisk paska narzędzi wpływa na ostatnio dodane wiązanie. Odwraca on kierunek wiązania.

Za pomocą narzędzia można wyświetlać i sprawdzać istniejące wiązania. Po kliknięciu pojawi się okno dialogowe. Następnie należy wybrać część w drzewie i kliknąć przycisk Importuj z drzewa, aby uzyskać wszystkie wiązania tej części, lub wybrać jedno lub więcej wiązań w drzewie i kliknąć przycisk Importuj z drzewa. W rezultacie otrzymasz wszystkie informacje o ograniczeniach. Klikając w kolumnie "Pomiń" można wyłączyć pojedyncze wiązanie. Więcej informacji można znaleźć w podpowiedziach innych przycisków okna dialogowego.

Lista części

Aby stworzyć listę części dla złożenia, poszczególne części złożenia muszą otrzymać informacje, które mogą być odczytane przez A2plus. Robi się to poprzez edycję części za pomocą przycisku na pasku narzędzi . W otwartej części naciśnij przycisk paska narzędzi i zostanie utworzony arkusz kalkulacyjny nazwany #PARTINFO#.

Struktura arkusza kalkulacyjnego wygląda następująco:

Wypełnij szare pola informacjami, które chcesz mieć na docelowej liście części.

W złożeniu lub podzespole użyj przycisku paska narzędzi . Pojawi się pytanie, czy chcesz iterować rekurencyjnie po wszystkich podzespołach. Kliknij na Yes. Spowoduje to utworzenie nowego arkusza kalkulacyjnego o nazwie #PARTSLIST#. Zawiera on informacje z różnych arkuszy kalkulacyjnych #PARTSINFO# części na liście takiej jak ta:

Pozycja (POS) jest automatycznie ustawiana zgodnie z wyglądem części w drzewie modelu. Część najwyższego poziomu otrzyma POS 1.

Ilość (QTY) jest automatycznie obliczana na podstawie złożenia. Jeśli część występuje dwukrotnie w zespole, otrzyma QTY 2.

Jeśli zaktualizowałeś informacje o części, możesz odświeżyć listę części, naciskając ponownie przycisk paska narzędzi .

Dla złożeń podrzędnych można również utworzyć arkusz informacyjny za pomocą przycisku paska narzędzi . Podczas tworzenia lub aktualizowania listy części głównego złożenia informacje te będą używane, jeśli klikniesz Nie na pytanie, czy chcesz iterować rekurencyjnie po wszystkich podzespołach. Wówczas różne części nie znajdują się na liście części, a jedynie w złożeniach podrzędnych.

Funkcje specjalne

Struktura złożenia

Przycisk paska narzędzi tworzy plik HTML ze strukturą złożenia. Plik zostanie domyślnie utworzony w folderze pliku złożenia. Struktura wygląda następująco:

Stopnie swobody

Przycisk oznacza każdą część złożenia z jej stopniami swobody. Ponadto wyświetla listę wszystkich części i ich zależności. Lista jest wyprowadzana do widżetu FreeCAD Widok raportu. Jeśli widżet ten nie jest obecnie widoczny, można go wyświetlić, klikając prawym przyciskiem myszy pustą część obszaru paska narzędzi FreeCAD, a następnie wybierając go w wyskakującym menu podręcznym lub za pomocą menu Widok → Panele → Widok raportu.

Etykiety stopni swobody można usunąć, klikając ponownie przycisk .

Etykiety części

Przycisk oznacza każdą część złożenia w widoku 3D jej nazwą. Etykiety części można usunąć, klikając ponownie przycisk .

Kształt całego złożenia

Czasami konieczne jest połączenie całego złożenia w jeden kształt. Kształt ten może być następnie użyty do drukowania 3D w środowisku Siatka lub do rysowania w środowisku Rysunek Techniczny. Jest on tworzony za pomocą przycisku paska narzędzi . Kształt nie jest domyślnie widoczny. Użyj tego samego przycisku paska narzędzi, aby zaktualizować kształt w przypadku zmian w złożeniu.

Konwersja ścieżek bezwzględnych na względne

Za pomocą opcji menu A2plus → Misc → Konwertuj bezwzględne ścieżki importowanych części na względne można konwertować ścieżki importowanych części.

Ustawienia

Dostęp do konfiguracji środowiska pracy A2plus można uzyskać poprzez menu FreeCAD Edycja → Preferencje ... i tam w sekcji A2plus. Można ustawić następujące opcje:

Domyślna metoda rozwiązywania

Użycie rozwiązywania układów cząstkowych: Rozwiązywanie rozpoczyna się od części, która ma właściwość DANEPozycja ustalona ustawioną na Prawda i części do niej związanej. Wszystkie pozostałe części nie podlegają obliczeniom. Jeśli uda się znaleźć rozwiązanie, do obliczeń dodawana jest następna związana część i tak dalej. Użyj "magnetycznego" solwera, rozwiązującego wszystkie części naraz: Solwer próbuje przesunąć wszystkie części naraz w kierunku części, która ma właściwość DANEPozycja ustalona ustawioną na "true". Należy pamiętać, że w większości przypadków obliczenie rozwiązania zajmie więcej czasu. Wymuś stałą pozycję: Ustawia właściwość DANEPozycja ustalona na wartość Prawda dla wszystkich części w złożeniu. Wówczas nie są wykonywane żadne obliczenia, ponieważ wszystkie części będą zawsze ustawione w pozycjach, w których zostały utworzone.

Domyślne działanie solvera

Rozwiąż automatycznie, jeśli właściwość wiązania zostanie zmieniona
Rozwiązywanie zostanie uruchomione automatycznie. Tak samo, jak użycie przycisku paska narzędzi .


Działanie podczas aktualizacji zaimportowanych części

Oblicz ponownie zaimportowane części przed ich aktualizacją
Wszystkie części złożenia, w tym złożenia podrzędne, zostaną otwarte we FreeCAD w celu zrekonstruowania przy użyciu wartości z arkuszy kalkulacyjnych.
Ta funkcja jest przeznaczona do konstruowania w pełni parametrycznego.

Uwaga: Ta funkcja jest bardzo eksperymentalna i nie jest zalecana w przypadku ważnych projektów.
Znane problemy:

  • Złożenie może zostać zniszczone z powodu błędnych odniesień do nazw topologicznych w częściach.
  • Główne arkusze kalkulacyjne mogą ulec uszkodzeniu podczas edycji, gdy plik części, do którego następuje odniesienie, jest już zamknięty. Może to spowodować awarię programu FreeCAD.

Włącz rekurencyjną aktualizację importowanych części: Otwiera rekurencyjnie wszystkie zespoły podrzędne w celu ich aktualizacji.

Używanie eksperymentalnego nazewnictwa topologicznego
Podczas importowania części do złożenia algorytm generuje nazwy topologiczne dla każdego elementu podrzędnego importowanego kształtu. Nadawane nazwy topologiczne są zapisywane we własciwości DANEmux Info. Kiedy zaimportowana część wymaga aktualizacji, te nazwy topologiczne są używane do aktualizacji elementów podrzędnych wiązań. Dzięki temu zespoły stają się bardziej odporne na zmienne numery elementów podrzędnych FreeCAD.
Uwaga: Zwiększa to rozmiary plików i czas obliczeń podczas importowania części. Jeśli ma być używane nazewnictwo topologiczne, należy je aktywować przed utworzeniem złożenia.
Dziedziczenie przezroczystości na powierzchnię z części i podzespołów
Użyj ustawień kolorów i przezroczystości z importowanych części.
Uwaga: Ta funkcja jest bardzo eksperymentalna i nie jest zalecana dla ważnych projektów.
Nie importuj niewidocznych kształtów
Spowoduje to ukrycie niewidocznych kształtów odniesienia / konstrukcji. Uwaga: Żadne wiązania nie mogą być połączone z kształtami odniesienia / konstrukcji w wyższych lub innych złożeniach podrzędnych. W przeciwnym razie może dojść do uszkodzenia złożenia.
Używaj łączenia brył do importowania części i złożeń
Wszystkie importowane części zostaną bezpośrednio połączone w całość.
Ta funkcja jest przydatna w przypadku MES lub symulacji drukowania 3D, jeśli dozwolona jest tylko jedna bryła. Alternatywą jest utworzenie kształtu całego zespołu później.

Ustawienia interfejsu użytkownika

Pokaż wiązania na pasku narzędzi: Jeśli ta opcja nie jest używana, przyciski paska narzędzi dla różnych wiązań nie są widoczne, aby zaoszczędzić miejsce na pasku narzędzi. Nowe wiązania można nadal ustawiać za pomocą okna dialogowego Narzędzia wiązań (przycisk paska narzędzi ). Użyj natywnego menedżera plików systemu operacyjnego: Jeśli ta opcja jest używana, podczas wybierania plików dla złożeń wyświetlane jest okno dialogowe plików systemu operacyjnego.

Zapisywanie plików

Użyj ścieżek względnych dla importowanych części
Używa względnych ścieżek do plików części.
Użyj bezwzględnych ścieżek dla importowanych części
Używa bezwzględnych ścieżek do plików części.
Wszystkie pliki znajdują się w tym folderze projektu
Wszystkie pliki projektu umieszczone są w określonym folderze. Nie ma znaczenia, czy znajdują się w podfolderach podrzędnych. Uwaga: Żaden plik nie może być w folderze kilka razy (np. w różnych podfolderach).
Ta opcja jest przydatna do pracy na różnych komputerach, ponieważ wystarczy skopiować folder projektu.

Rozwiązywanie problemów

Prędzej czy później pojawi się problem, że środowisko A2plus nie może rozwiązać ustalonych wiązań. Aby temu zaradzić, istnieją różne strategie:

Korzystanie z narzędzia do wyszukiwania konfliktów

Jest to najbezpieczniejsza metoda, gdy masz kilka ograniczeń, ponieważ narzędzie to próbuje rozwiązać jedno wiązanie po drugim, dopóki nie znajdzie konfliktowego wiązania. Następnie można przejść do innych strategii, aby rozwiązać zidentyfikowane wiązanie. Narzędzie jest wywoływane za pomocą przycisku na pasku narzędzi .

Sprawdzanie kierunku wiązania

Czasami wiązania wydają się być spójnie zdefiniowane, ale mimo to nie można ich rozwiązać. Przykład: Załóżmy, że masz wiązanie Równoległe płaszczyzny ustawione dla dwóch płaszczyzn. Teraz chcesz ustawić dla tych samych płaszczyzn wiązanie Płaszczyzna na płaszczyźnie i A2plus nie może tego rozwiązać. Wtedy kierunki wiązań Równoległe płaszczyzny i Płaszczyzna na płaszczyźnie są różne. Użyj tego samego kierunku dla obu wiązań, aby to naprawić.

Środowisko pracy A2plus oferuje automatyczne sprawdzanie właściwego kierunku dla wszystkich wiązań złożenia za pomocą przycisku paska narzędzi .

Usuwanie wiązań

Większość przypadków nierozwiązywalnych wiązań występuje bezpośrednio podczas dodawania nowego wiązania. Rozwiązaniem jest usunięcie ostatnio dodanego wiązania. A2plus również to zaproponuje.

Czasami strategia usuwania jest jedyną, na przykład podczas edycji części w programie FreeCAD, tak że brakuje ścian lub krawędzi połączonych z wiązaniami. Powinieneś wtedy usunąć jedno wiązanie, które jest połączone ze zmienioną częścią na raz. Użyj przycisku paska narzędzi po każdym usunięciu, aby sprawdzić, czy osiągnąłeś stan rozwiązywalny.

Gdy masz złożenie, które można rozwiązać, dodaj krok po kroku potrzebne wiązania.

Przesuwanie Części

W niektórych przypadkach solver potrzebuje tylko lepszych wartości początkowych, aby rozwiązać powiązania. Weźmy na przykład przypadek, w którym masz część osi i część koła. Dodajesz wiązanie zbieżność Osi i nie otrzymujesz informacji, że solver zawiódł, ale części nie są odpowiednio przesuwane, a w widżecie "Widok raportu" FreeCAD widzisz "REACHED POS-ACCURACY :0.0". Rozwiązaniem jest przesunięcie części bliżej pozycji, którą chcesz uzyskać za pomocą wiązania.

Uwaga: Upewnij się, że przynajmniej jedna część wiązania ma właściwość DANEPozycja ustalona ustawioną na Fałsz.

Ustawienie właściwości Czubka

Jeśli po zaimportowaniu do złożenia A2plus brakuje niektórych funkcji części, należy sprawdzić właściwość DANECzubek.

Środowisko pracy A2plus importuje bryły części ze wszystkimi ich cechami aż do cechy Czukek. Jest to rozsądne, ponieważ ustawienie właściwości Czubek na określoną cechę oznacza, że wszystkie cechy za nim nie powinny pojawić się w gotowej części. Jeśli więc przegapisz cechę części w A2plus, otwórz część za pomocą przycisku paska narzędzi , a następnie wybierz bryłę i spójrz na jej właściwość DANECzubek. Jeśli końcówka nie znajduje się w wybranym miejscu, kliknij prawym przyciskiem myszy w miejscu, w którym powinna się znajdować i wybierz Ustaw czubek. Na koniec zapisz część i przeładuj złożenie za pomocą przycisku na pasku narzędzi .

Naprawa drzewa montażu

Jeśli nie widzisz wyraźnego powodu, dla którego niektóre ograniczenia nie mogą zostać rozwiązane, możesz spróbować użyć przycisku paska narzędzi . Spowoduje to rozwiązanie wszystkich wiązań i ponowne pogrupowanie ich pod różnymi częściami.

Migracja starych złożeń A2plus

Zespoły utworzone za pomocą środowiska A2plus starszego niż marzec 2019 r. nie wyświetlają prawidłowych ikon dla importowanych części i mają przestarzałe właściwości. Złożenia te można zmigrować do A2plus w wersji 0.4.35 i nowszej za pomocą opcji menu A2plus → Misc → . Migruj proxy zaimportowanych części. Po wykonaniu tej czynności należy zapisać i ponownie otworzyć plik złożenia.

Unikanie znaków akcentowanych

Ta strategia nie jest konieczna dla systemu Windows.

W niektórych systemach operacyjnych mogą wystąpić problemy, jeśli nazwy plików lub ścieżki plików części lub zespołu zawierają znaki akcentowane. Dlatego należy unikać takich znaków, a także generalnie znaków specjalnych.

Pozycja ustalająca

Ta strategia nie jest już konieczna w przypadku złożeń utworzonych za pomocą A2plus 0.3.11 lub nowszej wersji, ponieważ A2plus wydaje teraz ostrzeżenie o braku ustalonych pozycji.

Po ustawieniu wiązania między dwiema częściami, gdy żadna część nie ma właściwości DANEustalona pozycja ustawionej na Prawda lub jest połączona wiązaniem z częścią z DANEustalona pozycja ustawioną na Prawda, wiązanie nie może zostać rozwiązane. To samo dzieje się, jeśli obie części wiązania mają DANEfixed Position ustawione na Prawda.

Następnie A2plus wyświetla informacje o nieudanym rozwiązaniu, ale czasami widać tylko, że części nie zostały odpowiednio przesunięte, a w widżecie "Widok raportu" FreeCAD widać "REACHED POS-ACCURACY :0.0". Oznacza to, że solver zakończył pracę bez błędów, ale w rzeczywistości nie mógł rozwiązać wiązań.

Dlatego sprawdź, czy przynajmniej jedna z części w złożeniu ma właściwość DANEustalona pozycja ustawioną na "true". Następnie upewnij się, że ustawiłeś ograniczenia tylko dla części, która jest w jakiś sposób połączona z częścią stałą. Aby zwizualizować te zależności, zobacz sekcję Struktura złożenia.

Obracanie części

Ta strategia nie jest już konieczna w przypadku złożeń utworzonych za pomocą środowiska pracy A2plus 0.4.0 lub nowszego, ponieważ A2plus automatycznie obraca części w tle, aby uzyskać wystarczający kąt początkowy dla solwera.

Solver często kończy się niepowodzeniem dla wiązania kątowePłaszczyzny, jeśli dwie wybrane płaszczyzny mają obecnie kąt 0° lub 180°. (Części nie są odpowiednio przesuwane, a w widżecie "Widok raportu" programu FreeCAD wyświetlany jest komunikat "REACHED POS-ACCURACY :0.0"). Rozwiązaniem tego problemu jest obrócenie jednej części o kilka stopni za pomocą funkcji transformacji FreeCAD (kliknij prawym przyciskiem myszy część w drzewie modelu i wybierz z menu kontekstowego Przemieszczenie).

Uwaga: Upewnij się, że przynajmniej jedna część wiązania ma właściwość DANEPozycja ustalona ustawioną na Fałsz.

Animacja

A2plus oferuje animacje za pomocą przeciągania oraz skryptów Pythona.

Przeciąganie

Animacje przeciągania są interaktywne, ponieważ uruchamia się je poprzez przeciągnięcie części złożenia. Aby uzyskać tego rodzaju animacje:

  1. W pełni zwiąż część, której ruch lub obrót ma być animowany
  2. Kliknij przycisk na pasku narzędzi . Spowoduje to włączenie trybu przeciągania.
  3. Kliknij wybraną część w zespole.
  4. Teraz możesz poruszać myszą, a część będzie podążać za ruchem myszy w ramach zdefiniowanych ograniczeń.
  5. Aby zakończyć tryb przeciągania, kliknij lewym przyciskiem myszy w złożeniu lub naciśnij ESC.

Oto przykładowy zestaw do wypróbowania animacji przeciągania: A2p_example-for-dragging-animation.FCStd.

Powyżej: Animacja przeciągania przy użyciu przykładowego złożenia.

Tworzenie skryptów

Pomimo tego, że tryb przeciągania oferuje ładne interaktywne animacje, czasami nie są one wystarczająco precyzyjne dla screencastów lub filmów. Animacje skryptowe mają tę zaletę, że animują ruchy i obroty w określony sposób. Można na przykład obrócić część o dokładnie 10° w przód i w tył. Poniższe przykłady wykorzystują złożenie, w którym część powinna zostać obrócona. Jeśli spróbujesz animować to za pomocą trybu przeciągania, zobaczysz, jak trudno jest uzyskać obrót w przód iw tył, który można np. pokazać szefowi w prezentacji. Dzięki interaktywnemu skryptowi przykładowemu jest to jednak łatwe zadanie.

Animacja skryptowa działa zazwyczaj w ten sposób:

  1. Zespół jest w pełni ograniczony
  2. Skrypt zmienia parametr, na przykład pozycję lub kąt obrotu części.
  3. Po zmianie parametru wiązania zespołu są rozwiązywane.
  4. Kroki 2. i 3. są powtarzane w celu uzyskania animacji.

Zamiast parametru rozmieszczenia można również zmienić ograniczenie, na przykład odległość między 2 płaszczyznami.

Przykład prostego skryptu

Najprostszym sposobem tworzenia skryptów animacji jest animacja nieinteraktywna, która podąża za zdefiniowanym ruchem. Oto przykład: Najpierw pobierz ten plik złożenia: A2p_animated-example.FCStd, a także ten skrypt Python: A2p_animation-example-script.py.

Jest to zawartość skryptu, a linie zaczynające się od "#" opisują, co robią poszczególne linie skryptu:

# import bibliotek
import time, math, PySide
import A2plus.a2p_solversystem as a2p_solver

# używamy kroków co 1 stopień
step = 1
# odczekaj 1 ms między każdym krokiem
timeout = 0.001
# początkowy kąt wynosi 0 stopni
angle = 0
# bierzemy aktualnie otwarty dokument
document = FreeCAD.activeDocument()
# chcemy później zmienić kąt obrotu części "star_wheel_001"
starWheel = document.getObject("star_wheel_001")
# zdefiniuj okno dialogowe postępu działające od 0 do 360
progressDialog = PySide.QtGui.QProgressDialog(u " Animation progress", u " Stop", 0, 360)

# blok while jest główną pętlą zmieniającą kąt i rozwiązującą
# ograniczenia montażowe następnie
while angle < 360: # wykonuj tę pętlę, aż uzyskamy jeden pełny obrót (360 stopni)
    # zwiększyć kąt obrotu
    angle += step
    # ustaw nowy kąt w oknie dialogowym postępu
    progressDialog.setValue(angle)
    # zmień kąt obrotu części "star_wheel_001"
    starWheel.Placement.Rotation.Angle = math.radians(angle)
    # rozwiąż ograniczenia 
    a2p_solver.solveConstraints(document, useTransaction=True)
    # zaktualizuj widok po rozwiązaniu ("Gui" oznacza "graficzny interfejs użytkownika")
    FreeCADGui.updateGui()
    # przenieś okno dialogowe postępu na przód
    PySide.QtGui.QWidget.raise_(progressDialog)
    # jeśli w oknie dialogowym naciśnięto "Stop", wyjdź z pętli
    if progressDialog.wasCanceled():
        angle = 360
    # odczekaj jakiś czas przed wykonaniem następnego kroku
    time.sleep(timeout)

Aby użyć skryptu do wykonania animacji, musimy

  1. Otworzyć plik złożenia w programie FreeCAD.
  2. Otworzyć plik skryptu w programie FreeCAD.
  3. Kliknąć przycisk paska narzędzi , aby wykonać skrypt (zwany również makrem).
  4. Przejdź do zakładki zespołu, aby zobaczyć obrót.

Aby poćwiczyć, po prostu zmień coś w skrypcie i wykonaj go później. Na przykład zwiększyć "krok" do "5".

Oto wynik przykładowej animacji:

Przykład interaktywnego skryptu

Pierwszy przykład skryptu pokazał, jak utworzyć animację bez żadnej informacji zwrotnej od użytkownika. W przypadku większości aplikacji konieczna jest interakcja z animacją. Na przykład interesującą kwestią w tym przykładzie jest zobaczenie, jak szpilki napędowe przecinają środkowy rowek koła. Aby przyjrzeć się temu bliżej, można zaprezentować ten szczegół współpracownikom lub szefowi. Dlatego potrzebne jest interaktywne rozwiązanie.

Można to zrobić za pomocą niestandardowego okna dialogowego animacji z suwakiem. Przesuwając suwak można ustawić kąt obrotu, a tym samym obracać się tam i z powrotem w interesującej pozycji.

Używamy tego samego pliku asemblera: A2p_animated-example.FCStd i tego skryptu Pythona: A2p_animation-example-script.py.

Jest to treść skryptu, który wyświetla interaktywne okno dialogowe animacji:

# import bibliotek
import time, math, PySide, sys
import FreeCAD.A2plus.a2p_solversystem as a2p_solver
from FreeCAD import Units
from PySide import QtCore, QtGui

# odczekać 1 ms po każdym obliczeniu
timeout = 0.001
# pobieramy aktualnie otwarty dokument
document = FreeCAD.activeDocument()
# chcemy później zmienić kąt obrotu części "star_wheel_001"
starWheel = document.getObject("star_wheel_001")

class AnimationDlg(QtGui.QWidget): # okno dialogowe animacji

    def __init__(self): # to initialize the dialog
        super(AnimationDlg, self).__init__()
        self.initUI()

    def initUI(self): # definicja komponentów okna dialogowego
        self.setMinimumSize(self.minimumSizeHint()) # set the minimal dialog size to minimum
        self.setWindowTitle('Animation Dialog')
        # używać układu siatki dla całego formularza
        self.mainLayout = QtGui.QGridLayout()
        self.lineNo = 0 # first dialog grid line
        # Dodaj etykietę opisu
        DescriptionLabel = QtGui.QLabel(self)
        DescriptionLabel.setText("Change slider to change rotation angle")
        self.mainLayout.addWidget(DescriptionLabel,self.lineNo,0,1,4)
         # następny wiersz okna dialogowego
        self.lineNo += 1
        # dodaje etykietę; nie ma potrzeby stosowania przedrostka "self.", ponieważ nie chcemy później zmieniać etykiety.
        LabelMin = QtGui.QLabel(self)
        LabelMin.setText("Min")
        LabelMin.setFixedHeight(32)
        self.mainLayout.addWidget(LabelMin,self.lineNo,0)
        # dodać edycję obrotową, aby zdefiniować minimum suwaka
        self.MinEdit = QtGui.QSpinBox(self)
        # pobiera jednostkę kąta jako ciąg znaków
        self.MinEdit.setSuffix(" " + str(FreeCAD.Units.Quantity(1, FreeCAD.Units.Angle))[2:])
        self.MinEdit.setMaximum(999)
        self.MinEdit.setMinimum(0)
        self.MinEdit.setSingleStep(10)
        self.MinEdit.setValue(0)
        self.MinEdit.setFixedHeight(32)
        self.MinEdit.setToolTip("Minimal angle for the slider")
        QtCore.QObject.connect(self.MinEdit, QtCore.SIGNAL("valueChanged(int)"), self.setMinEdit)
        self.mainLayout.addWidget(self.MinEdit,self.lineNo,1)
        # dodaj suwak
        self.slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)
        self.slider.setRange(0, 360)
        self.slider.setValue(0)
        self.slider.setFixedHeight(32)
        self.slider.setToolTip("Move the slider to change the rotation angle")
        QtCore.QObject.connect(self.slider, QtCore.SIGNAL("sliderMoved(int)"), self.handleSliderValue)
        self.mainLayout.addWidget(self.slider,self.lineNo,2)
        # dodaj etykietę
        LabelMax = QtGui.QLabel(self)
        LabelMax.setText("Max")
        LabelMax.setFixedHeight(32)
        self.mainLayout.addWidget(LabelMax,self.lineNo,3)
        # dodaje edycję obrotową, aby zdefiniować maksimum suwaka
        self.MaxEdit = QtGui.QSpinBox(self)
        # pobiera jednostkę kąta jako ciąg znaków
        self.MaxEdit.setSuffix(" " + str(FreeCAD.Units.Quantity(1, FreeCAD.Units.Angle))[2:])
        self.MaxEdit.setMaximum(999)
        self.MaxEdit.setMinimum(1)
        self.MaxEdit.setSingleStep(10)
        self.MaxEdit.setValue(360)
        self.MaxEdit.setFixedHeight(32)
        self.MaxEdit.setToolTip("Maximal angle for the slider")
        QtCore.QObject.connect(self.MaxEdit, QtCore.SIGNAL("valueChanged(int)"), self.setMaxEdit)
        self.mainLayout.addWidget(self.MaxEdit,self.lineNo,4)
         # następny wiersz okna dialogowego
        self.lineNo += 1
        # dodaje element dystansowy
        self.mainLayout.addItem(QtGui.QSpacerItem(10,10), 0, 0)
        # dodaje etykietę
        LabelCurrent = QtGui.QLabel(self)
        LabelCurrent.setText("Current angle:")
        LabelCurrent.setFixedHeight(32)
        self.mainLayout.addWidget(LabelCurrent,self.lineNo,1)
        # wyświetla bieżący kąt
        self.CurrentAngle = QtGui.QLineEdit(self)
        self.CurrentAngle.setText(str(0))
        self.CurrentAngle.setFixedHeight(32)
        self.CurrentAngle.setToolTip("Current rotation angle")
        self.CurrentAngle.isReadOnly()
        self.mainLayout.addWidget(self.CurrentAngle,self.lineNo,2)
        # dodaje etykietę dla urządzenia
        LabelUnit = QtGui.QLabel(self)
        LabelUnit.setText("deg")
        LabelUnit.setFixedHeight(32)
        self.mainLayout.addWidget(LabelUnit,self.lineNo,3)
        # aby zamknąć okno dialogowe
        self.Close = QtGui.QPushButton(self)
        self.Close.setText("Close")
        self.Close.setFixedHeight(32)
        self.Close.setToolTip("Closes the dialog")
        QtCore.QObject.connect(self.Close, QtCore.SIGNAL("clicked()"), self.CloseClicked)
        self.mainLayout.addWidget(self.Close,self.lineNo,4)
        # place the defined grid layout to the dialog
        self.setLayout(self.mainLayout)
        self.update()

    def handleSliderValue(self):
        # ustawia wartość suwaka jako kąt
        starWheel.Placement.Rotation.Angle = math.radians(self.slider.value())
        # kąt prądu wyjściowego
        self.CurrentAngle.setText(str(self.slider.value()))
        # rozwiązywanie wiązań
        a2p_solver.solveConstraints(document)
        # aktualizacja widoku po rozwiązaniu ''("Gui" oznacza "graficzny interfejs użytkownika")''
        FreeCADGui.updateGui()
        # odczekaj trochę czasu, ważne jest, aby dać czas na wykonanie obliczeń.
        time.sleep(timeout)

    def setMinEdit(self):
        # upewnij się, że minimum jest mniejsze niż maksimum
        if self.MinEdit.value() >=  self.MaxEdit.value():
            self.MaxEdit.setValue(self.MinEdit.value() + 1)
        self.slider.setRange(self.MinEdit.value(), self.MaxEdit.value())

    def setMaxEdit(self):
        # upewnić się, że minimum jest mniejsze niż maksimum
        if self.MinEdit.value() >=  self.MaxEdit.value():
            self.MinEdit.setValue(self.MaxEdit.value() - 1)
        self.slider.setRange(self.MinEdit.value(), self.MaxEdit.value())

    def CloseClicked(self):
        AnimationDialog.close()

# utwórz i wyświetl zdefiniowane okno dialogowe
AnimationDialog = AnimationDlg()
AnimationDialog.show()

# uruchom tę pętlę, gdy okno dialogowe jest widoczne
while AnimationDialog.isVisible():
    # aktualizacja widoku; ważne, aby system operacyjny otrzymał informację zwrotną, że okno dialogowe jest aktywne
    FreeCADGui.updateGui()
    # przeniesienie okna dialogowego na przód, tak aby było ono zawsze widoczne
    QtGui.QWidget.raise_(AnimationDialog)
    # wartość wyjściowa suwaka również tutaj, ponieważ podczas obliczeń suwak mógł zostać przesunięty
    AnimationDialog.CurrentAngle.setText(str(AnimationDialog.slider.value()))

Okno dialogowe zdefiniowane w skrypcie wygląda następująco:

Polecenia skryptu

Aby lepiej zrozumieć składnię skryptu, oto kilka informacji o poleceniach:

starWheel.Placement.Rotation.Angle = math.radians(angle)

Tutaj zmieniamy właściwość umieszczania Rotation.Angle części otrzymanej wcześniej jako starWheel. Ta właściwość pobiera kąt jako radian. Funkcja radians() z biblioteki math konwertuje kąt ze stopni na radiany.

Właściwość Rotation.Angle wykorzystuje bieżącą oś umieszczenia części (w naszym przykładzie oś X). Aby obrócić część np. wokół osi Z, można ustawić oś obrotu (przed wywołaniem polecenia obrotu) za pomocą polecenia:

starWheel.Placement.Rotation.Axis = FreeCAD.Vector(0,0,1)

Zamiast obracać, części można również przesuwać. Aby zmienić na przykład położenie koła w kierunku Y, polecenie brzmiałoby:

starWheel.Placement.Base.y = PositionShift

W tym przypadku nie definiowalibyśmy zmiennej angle, ale PositionShift, którą zmieniamy przy każdym przebiegu pętli.

Istnieją różne sposoby ustawiania położenia części. Niektóre z nich są udokumentowane na stronie Umiejscowienie. Niestety nie ma (jeszcze) listy wszystkich możliwych poleceń umiejscowienia.

a2p_solver.solveConstraints(document, useTransaction=False/True)

Jest to polecenie specyficzne dla środowiska pracy A2plus. Rozwiązuje ono wiązania złożenia, które wcześniej otrzymaliśmy jako document. Opcja useTransaction określa, czy FreeCAD powinien przechowywać każdą zmianę w stosie cofania / ponawiania. W przypadku dużych animacji można więc ustawić ją na false.