Macro EdgesToArc/cs: Difference between revisions

From FreeCAD Documentation
(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:
<languages/>
{{Macro|Icon=Text-x-python|Name=EdgesToArc|Description=Pokud je to možné nahradí vybrané hrany kružnicovým obloukem. Užitečné pro obnovu rozpadlých oblouků.|Author=Jreinhardt}}
<div class="mw-translate-fuzzy">
{{Macro/cs
|Name=EdgesToArc
|Icon=Macro_EdgesToArc.png
|Translate=EdgesToArc
|Description=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.
|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ý 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 umožňuje relativně snadno konvertovat takový oblouk složený z přímek vrátit do kružnicového oblouku. Snižuje to velikost souboru a soubor to dělá mnohem snadněji zpracovatelným,
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}}
<languages/>

Latest revision as of 21:07, 4 November 2021

Other languages:

EdgesToArc

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
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

ToolBar Icon

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)