Macro EdgesToArc/cs: Difference between revisions
(Created page with "Občas někdo narazí na drát, který obsahuje oblouk vytvořený z malých přímých segmentů. Často se to stává při práci se soubory z jiných programů. Toto makro ...") |
No edit summary |
||
(19 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
⚫ | |||
⚫ | |||
<div class="mw-translate-fuzzy"> |
|||
{{Macro/cs |
|||
|Name=EdgesToArc |
|||
|Icon=Macro_EdgesToArc.png |
|||
|Translate=EdgesToArc |
|||
⚫ | |||
|Author=Jreinhardt |
|||
|Version=1.0 |
|||
|Date=2014-01-02 |
|||
|SeeAlso=[[Macro_SuperWire/cs|Macro SuperWire]] |
|||
}} |
|||
</div> |
|||
==Description== |
|||
⚫ | Občas někdo narazí na drát (lomenou čáru), který je obsažen v oblouku vytvořeném z malých přímých segmentů. Často se to stává při práci se soubory z jiných programů. Toto makro umožňuje relativně snadno konvertovat takový oblouk složený z přímek zpět do kružnicového oblouku. Snižuje to velikost souboru a soubor to dělá mnohem snadněji zpracovatelným, |
||
<div class="mw-translate-fuzzy"> |
|||
Pro použití tohoto makra musíte rozlámat drát do jednotlivých hran použitím funkce {{KEY|[[Image:Draft Downgrade.png|16px]] [[Draft Downgrade]]}}. Potom jen vyberete segmenty, které chcete nahradit kružnicovým obloukem a spustíte makro. Potřebujete minimálně 2 segmenty. |
|||
</div> |
|||
Makro zkontroluje jestli segmenty leží na obecné kružnici a pokud ne, samo se ukončí. Jinak vytvoří oblouk a odstraní segmenty. |
|||
<div class="mw-translate-fuzzy"> |
|||
⚫ | Občas někdo narazí na drát, který |
||
Kvůli malým nepřesnostem ve výpočtu, může funkce {{KEY|[[Image:Draft Upgrade.png|16px]] [[Draft Upgrade]]}} někdy skončit chybně a vrátit oblouk zpět do drátu. V takovém případě poskytne lepší výsledek mnohem robustnější makro [[Macro_SuperWire]]. |
|||
</div> |
|||
==Script== |
|||
To use this macro, you have to break down the wire into individual edges using the {{KEY|[[Image:Draft Downgrade.png|16px]] [[Draft Downgrade]]}} function. Then just select the segments that you want to replace by an circular arc and execute the macro. You need at least two segments. |
|||
ToolBar Icon [[Image:Macro_EdgesToArc.png]] |
|||
The macro will check whether the segments all lie on a common circle and will abort if this is not the case. Otherwise it will create the arc and remove the segments. |
|||
'''Macro_EdgesToArc.FCMacro''' |
|||
Because of small inaccuracies in the calculations, the {{KEY|[[Image:Draft Upgrade.png|16px]] [[Draft Upgrade]]}} function can sometimes fail to recombine the other edges and the arcs back into a wire. In this case the [[Macro_SuperWire]] provides a more robust way to do this. |
|||
{{MacroCode|code= |
|||
<syntaxhighlight> |
|||
import Draft |
import Draft |
||
import FreeCADGui, FreeCAD |
import FreeCADGui, FreeCAD |
||
Line 74: | Line 97: | ||
for shape in sel: |
for shape in sel: |
||
FreeCAD.ActiveDocument.removeObject(shape.Name) |
FreeCAD.ActiveDocument.removeObject(shape.Name) |
||
}} |
|||
</syntaxhighlight> |
|||
{{clear}} |
{{clear}} |
||
⚫ |
Latest revision as of 21:07, 4 November 2021
Popis |
---|
Pokud je to možné nahradí vybrané hrany kružnicovým obloukem. Užitečné pro obnovu oblouků rozpadlých do krátkých přímek. Version macro : 1.0 Date last modification : 2014-01-02 Autor: Jreinhardt |
Autor |
Jreinhardt |
Download |
None |
Odkazy |
Makro recepty| Jak nainstalovat makra Jak přizpůsobit panely nástrojů |
Verze |
1.0 |
Datum poslední úpravy |
2014-01-02 |
Verze FreeCAD |
None |
Výchozí zástupce |
None |
Viz též |
Macro SuperWire |
Description
Občas někdo narazí na drát (lomenou čáru), který je obsažen v oblouku vytvořeném z malých přímých segmentů. Často se to stává při práci se soubory z jiných programů. Toto makro umožňuje relativně snadno konvertovat takový oblouk složený z přímek zpět do kružnicového oblouku. Snižuje to velikost souboru a soubor to dělá mnohem snadněji zpracovatelným,
Pro použití tohoto makra musíte rozlámat drát do jednotlivých hran použitím funkce Draft Downgrade. Potom jen vyberete segmenty, které chcete nahradit kružnicovým obloukem a spustíte makro. Potřebujete minimálně 2 segmenty.
Makro zkontroluje jestli segmenty leží na obecné kružnici a pokud ne, samo se ukončí. Jinak vytvoří oblouk a odstraní segmenty.
Kvůli malým nepřesnostem ve výpočtu, může funkce Draft Upgrade někdy skončit chybně a vrátit oblouk zpět do drátu. V takovém případě poskytne lepší výsledek mnohem robustnější makro Macro_SuperWire.
Script
Macro_EdgesToArc.FCMacro
import Draft import FreeCADGui, FreeCAD from FreeCAD import Base, Console from math import atan2, pi, fabs #This macro replaces a number of edges approximating a circular arc by a proper circular arc. #It might be necessary to use the superwire macro to recombine the edges back to a wire, because of small errors in the calculations. sel = FreeCADGui.Selection.getSelection() if len(sel) < 2: Console.PrintError("Too few edges are selected\n") edges = [s.Shape for s in sel] start_vertices = [] end_vertices = [] for edge in edges: start_vertices.append(edge.Vertexes[0].Point) end_vertices.append(edge.Vertexes[1].Point) vertices = start_vertices + end_vertices start,end,middle = None,None,None #find start and end points for edge in edges: is_start = True is_end = True for point in end_vertices: if edge.Vertexes[0].Point.distanceToPoint(point) < 1e-8: is_start = False for point in start_vertices: if edge.Vertexes[1].Point.distanceToPoint(point) < 1e-8: is_end = False if is_start: start = edge.Vertexes[0].Point if is_end: end = edge.Vertexes[1].Point #find middle point, at least not too far away from the middle for v in vertices: ratio = v.distanceToPoint(start)/v.distanceToPoint(end) if ratio > 0.5 and ratio < 2.: middle = v break if middle is None: Console.PrintError("Could not find suitable middle point\n") arc = Part.ArcOfCircle(start,middle,end) #Check circularity circular = True for v in vertices: if fabs(v.distanceToPoint(arc.Center) - arc.Radius) > 1e-6: Console.PrintError("Edges do not approximate a circular arc\n") circular = False break if circular: Part.show(arc.toShape()) for shape in sel: FreeCAD.ActiveDocument.removeObject(shape.Name)