add bt_player

This commit is contained in:
2021-11-24 17:00:32 +01:00
parent 3bc6987c3b
commit 880e936dc3
92 changed files with 16476 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
# -*- coding: utf-8 -*-
###########################################################################
## Python code generated with wxFormBuilder (version Oct 26 2018)
## http://www.wxformbuilder.org/
##
## PLEASE DO *NOT* EDIT THIS FILE!
###########################################################################
import wx
import wx.xrc
###########################################################################
## Class TraceClearanceDlg
###########################################################################
class TraceClearanceDlg ( wx.Dialog ):
def __init__( self, parent ):
wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 373,480 ), style = wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER )
self.SetSizeHints( wx.Size( 373,580 ), wx.DefaultSize )
bSizer2 = wx.BoxSizer( wx.VERTICAL )
self.m_staticText4 = wx.StaticText( self, wx.ID_ANY, u"Add copper pour keepout\nto selected traces.", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText4.Wrap( -1 )
bSizer2.Add( self.m_staticText4, 0, wx.ALL, 5 )
bSizer5 = wx.BoxSizer( wx.HORIZONTAL )
self.m_bitmap = wx.StaticBitmap( self, wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer5.Add( self.m_bitmap, 0, wx.ALL, 5 )
bSizer2.Add( bSizer5, 1, wx.EXPAND, 5 )
bSizer3 = wx.BoxSizer( wx.HORIZONTAL )
self.m_staticText5 = wx.StaticText( self, wx.ID_ANY, u"Zone clearance (mm)", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText5.Wrap( -1 )
bSizer3.Add( self.m_staticText5, 0, wx.ALL, 5 )
self.m_clearance = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer3.Add( self.m_clearance, 0, wx.ALL, 5 )
bSizer2.Add( bSizer3, 1, wx.EXPAND, 5 )
bSizer4 = wx.BoxSizer( wx.HORIZONTAL )
self.m_button_ok = wx.Button( self, wx.ID_OK, u"OK", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer4.Add( self.m_button_ok, 0, wx.ALL, 5 )
self.m_button_cancel = wx.Button( self, wx.ID_CANCEL, u"Cancel", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer4.Add( self.m_button_cancel, 0, wx.ALL, 5 )
bSizer2.Add( bSizer4, 1, wx.EXPAND, 5 )
self.SetSizer( bSizer2 )
self.Layout()
self.Centre( wx.BOTH )
def __del__( self ):
pass

View File

@@ -0,0 +1,2 @@
from .trace_clearance import TraceClearance
TraceClearance().register()

View File

@@ -0,0 +1,485 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="15" />
<object class="Project" expanded="1">
<property name="class_decoration">; </property>
<property name="code_generation">Python</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file">TraceClearanceDlg</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="indent_with_spaces"></property>
<property name="internationalize">0</property>
<property name="name">TraceClearanceDlg</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_enum">0</property>
<property name="use_microsoft_bom">0</property>
<object class="Dialog" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="center">wxBOTH</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="extra_style"></property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size">373,580</property>
<property name="name">TraceClearanceDlg</property>
<property name="pos"></property>
<property name="size">373,580</property>
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
<property name="subclass">; ; forward_declare</property>
<property name="title"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer2</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Add copper pour keepout&#x0A;to selected traces.</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticText4</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer5</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticBitmap" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_bitmap</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer3</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Zone clearance (mm)</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_staticText5</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxTextCtrl" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="maxlength"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_clearance</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="value"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer4</property>
<property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_OK</property>
<property name="label">OK</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_button_ok</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_CANCEL</property>
<property name="label">Cancel</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_button_cancel</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,235 @@
#!/usr/bin/env python
# Copyright 2019 Maurice https://github.com/easyw/
# Copyright 2020 Matt Huszagh https://github.com/matthuszagh
# GNU GENERAL PUBLIC LICENSE
# Version 3, 29 June 2007
#
# Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
# Everyone is permitted to copy and distribute verbatim copies
# of this license document, but changing it is not allowed.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
import os
import pcbnew
import wx
# import numpy as np
from . import TraceClearanceDlg
import math
class TraceClearance_Dlg(TraceClearanceDlg.TraceClearanceDlg):
"""
"""
def SetSizeHints(self, sz1, sz2):
if wx.__version__ < '4.0':
self.SetSizeHintsSz(sz1, sz2)
else:
super(TraceClearance_Dlg, self).SetSizeHints(sz1, sz2)
def __init__(self, parent):
"""
"""
TraceClearanceDlg.TraceClearanceDlg.__init__(self, parent)
self.SetMinSize(self.GetSize())
class TraceClearance(pcbnew.ActionPlugin):
"""
"""
def defaults(self):
"""
"""
self.name = "Trace Clearance Generator\n version 1.4"
self.category = ""
self.description = (
"Generate a copper pour keepout for a selected trace."
)
self.show_toolbar_button = True
self.icon_file_name = os.path.join(
os.path.dirname(__file__), "./trace_clearance.png"
)
def Run(self):
"""
"""
_pcbnew_frame = [x for x in wx.GetTopLevelWindows() if x.GetName() == 'PcbFrame'][0]
# _pcbnew_frame = [
# x
# for x in wx.GetTopLevelWindows()
# if x.GetTitle().lower().startswith("pcbnew")
# ][0]
wx_params = TraceClearance_Dlg(_pcbnew_frame)
wx_params.m_clearance.SetValue("0.2")
wx_params.m_bitmap.SetBitmap(
wx.Bitmap(
os.path.join(
os.path.dirname(os.path.realpath(__file__)),
"trace_clearance_dialog.png",
)
)
)
modal_res = wx_params.ShowModal()
clearance = pcbnew.FromMM(
self.InputValid(wx_params.m_clearance.GetValue())
)
if clearance is not None:
pcb = pcbnew.GetBoard()
if modal_res == wx.ID_OK:
tracks = selected_tracks(pcb)
if len(tracks) > 0:
set_keepouts(pcb, tracks, clearance)
else:
self.Warn("At least one track must be selected.")
elif modal_res == wx.ID_CANCEL:
wx_params.Destroy()
def Warn(self, message, caption="Warning!"):
"""
"""
dlg = wx.MessageDialog(None, message, caption, wx.OK | wx.ICON_WARNING)
dlg.ShowModal()
dlg.Destroy()
def InputValid(self, value):
"""
"""
try:
float_val = float(value)
except:
self.Warn("Clearance must be a floating point number.")
if float_val <= 0:
self.Warn("Clearance must be positive.")
return float_val
def selected_tracks(pcb):
"""
TODO should we use a common import with solder expander to avoid
redundant functionality?
"""
tracks = []
if hasattr(pcbnew,'TRACK'):
track_item = pcbnew.TRACK
else:
track_item = pcbnew.PCB_TRACK
for item in pcb.GetTracks():
if type(item) is track_item and item.IsSelected():
tracks.append(item)
return tracks
def set_keepouts(pcb, tracks, clearance):
"""
"""
for track in tracks:
track_start = track.GetStart()
track_end = track.GetEnd()
if track_start.x == track_end.x and track_start.y == track_end.y:
continue
track_width = track.GetWidth()
layer = track.GetLayerSet()
if hasattr(pcbnew,'ZONE_CONTAINER'):
keepout = pcbnew.ZONE_CONTAINER(pcb)
pts = poly_points(track_start, track_end, track_width, clearance)
keepout.AddPolygon(pts)
keepout.SetIsKeepout(True)
keepout.SetDoNotAllowCopperPour(True)
keepout.SetDoNotAllowVias(False)
keepout.SetDoNotAllowTracks(False)
keepout.SetLayerSet(layer)
else:
keepout = pcbnew.ZONE(pcb)
pts = poly_points(track_start, track_end, track_width, clearance)
# wx.LogMessage(str(pts))
keepout.AddPolygon(pts)
#keepout.SetIsKeepout(True)
keepout.SetIsRuleArea(True) # was SetIsKeepout
keepout.SetDoNotAllowCopperPour(True)
keepout.SetDoNotAllowVias(False)
keepout.SetDoNotAllowTracks(False)
keepout.SetLayerSet(layer)
pcb.Add(keepout)
pcbnew.Refresh()
def poly_points(track_start, track_end, track_width, clearance):
"""
"""
delta = track_width / 2 + clearance
dx = track_end.x - track_start.x
dy = track_end.y - track_start.y
# theta = np.arctan2(dy, dx)
theta = math.atan2(dy, dx)
# len = np.sqrt(np.power(dx, 2) + np.power(dy, 2))
len = math.sqrt(math.pow(dx, 2) + math.pow(dy, 2))
dx_norm = dx / len
dy_norm = dy / len
delta_x = delta * -dy_norm
delta_y = delta * dx_norm
pt_delta = pcbnew.wxPoint(delta_x, delta_y)
pts = []
pts.append(track_start + pt_delta)
for pt in semicircle_points(track_start, delta, theta, True):
pts.append(pt)
pts.append(track_start - pt_delta)
pts.append(track_end - pt_delta)
for pt in semicircle_points(track_end, delta, theta, False):
pts.append(pt)
pts.append(track_end + pt_delta)
return pcbnew.wxPoint_Vector(pts)
def semicircle_points(circle_center, radius, angle_norm, is_start=True):
"""
"""
num_points = 20
# angles = np.linspace(
# angle_norm + np.pi / 2, angle_norm + 3 * np.pi / 2, num_points + 2
# )
start = angle_norm + math.pi / 2
stop = angle_norm + 3 * math.pi / 2
num_vals = num_points
delta = (stop-start)/(num_vals-1)
evenly_spaced = [start + i * delta for i in range(num_vals)]
# print(evenly_spaced)
angles = evenly_spaced
# wx.LogMessage(str(angles))
angles = angles[1:-1]
# wx.LogMessage(str(angles)+'1')
if not is_start:
# angles = np.add(angles, np.pi)
angles.append(math.pi)
pts = []
for ang in angles:
# pts.append(
# circle_center
# + pcbnew.wxPoint(radius * np.cos(ang), radius * np.sin(ang))
# )
pts.append(
circle_center
+ pcbnew.wxPoint(radius * math.cos(ang), radius * math.sin(ang))
)
return pcbnew.wxPoint_Vector(pts)

View File

@@ -0,0 +1,105 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="15.88482mm"
height="15.721636mm"
viewBox="0 0 15.88482 15.721636"
version="1.1"
id="svg8"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
sodipodi:docname="trace_clearance.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="15.839192"
inkscape:cx="14.743001"
inkscape:cy="37.63336"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="3840"
inkscape:window-height="2098"
inkscape:window-x="3840"
inkscape:window-y="0"
inkscape:window-maximized="0" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-20.417313,-280.90036)">
<rect
id="rect3713"
width="15.791624"
height="15.721636"
x="20.417313"
y="280.90036"
style="fill:#408b40;fill-opacity:1;stroke-width:0.11733633" />
<circle
style="fill:#404500;fill-opacity:1;stroke-width:0.26458332"
id="path4520"
cx="26.331844"
cy="288.75327"
r="4.1104908" />
<rect
style="fill:#404500;fill-opacity:1;stroke-width:0.17122415"
id="rect4522"
width="9.9543514"
height="8.2116957"
x="26.235428"
y="284.6459" />
<circle
r="0.930112"
cy="288.75327"
cx="25.799042"
id="circle4535"
style="fill:#ffd940;fill-opacity:1;stroke-width:0.05986928" />
<rect
y="287.82385"
x="25.777225"
height="1.8581228"
width="10.415862"
id="rect4537"
style="fill:#ffd940;fill-opacity:1;stroke-width:0.08331572" />
<path
style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 26.758661,284.67076 -4.415098,4.97522"
id="path5158"
inkscape:connector-curvature="0" />
<path
style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 33.096885,284.68121 -7.235291,8.1532"
id="path5162"
inkscape:connector-curvature="0" />
<path
style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 36.115144,288.42192 -3.960871,4.46336"
id="path5166"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1,184 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="94.798798mm"
height="62.886559mm"
viewBox="0 0 94.798796 62.886559"
version="1.1"
id="svg8"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
sodipodi:docname="trace_clearance_dialog.svg">
<defs
id="defs2">
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path5887"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path5884"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(0.8,0,0,0.8,10,0)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.9899495"
inkscape:cx="-17.310534"
inkscape:cy="13.316301"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="2098"
inkscape:window-x="3840"
inkscape:window-y="0"
inkscape:window-maximized="0" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(15.132237,-257.3179)">
<path
style="fill:#408b40;fill-opacity:1;stroke-width:0.46934533"
d="m -15.132237,257.3179 h 63.166496 v 62.88656 h -63.166496 z"
id="rect3713"
inkscape:connector-curvature="0" />
<path
style="fill:#404500;fill-opacity:1;stroke-width:1.05833328"
d="m 24.967851,288.72954 a 16.441963,16.441963 0 0 1 -16.441964,16.44196 16.441963,16.441963 0 0 1 -16.44196,-16.44196 16.441963,16.441963 0 0 1 16.44196,-16.442 16.441963,16.441963 0 0 1 16.441964,16.442 z"
id="path4520"
inkscape:connector-curvature="0" />
<path
style="fill:#404500;fill-opacity:1;stroke-width:0.68489659"
d="m 8.140223,272.30006 h 39.817404 v 32.8468 H 8.140223 Z"
id="rect4522"
inkscape:connector-curvature="0" />
<path
style="fill:#ffd940;fill-opacity:1;stroke-width:0.23947711"
d="m 10.115127,288.72954 a 3.720448,3.720448 0 0 1 -3.720448,3.72044 3.720448,3.720448 0 0 1 -3.720448,-3.72044 3.720448,3.720448 0 0 1 3.720448,-3.72048 3.720448,3.720448 0 0 1 3.720448,3.72048 z"
id="circle4535"
inkscape:connector-curvature="0" />
<path
style="fill:#ffd940;fill-opacity:1;stroke-width:0.33326289"
d="m 6.307411,285.01186 h 41.663452 v 7.43252 H 6.307411 Z"
id="rect4537"
inkscape:connector-curvature="0" />
<path
style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 10.233155,272.3995 -7.427237,292.30038"
id="path5158"
inkscape:connector-curvature="0" />
<path
style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 35.586051,272.4413 6.644887,305.0541"
id="path5162"
inkscape:connector-curvature="0" />
<path
style="fill:#ff0000;fill-opacity:1;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 47.659087,287.40414 31.815603,305.25758"
id="path5166"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.19122508;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lend)"
d="M 50.053403,292.92078 V 304.7657"
id="path5335"
inkscape:connector-curvature="0" />
<g
aria-label="clearance"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
id="text6820"
transform="matrix(4,0,0,4,-96.801489,-866.28354)">
<path
d="m 37.996455,291.0657 v 0.11851 q -0.05374,-0.0296 -0.108176,-0.0441 -0.05374,-0.0152 -0.108865,-0.0152 -0.123335,0 -0.191548,0.0786 -0.06821,0.0779 -0.06821,0.21911 0,0.14125 0.06821,0.2198 0.06821,0.0779 0.191548,0.0779 0.05512,0 0.108865,-0.0145 0.05443,-0.0152 0.108176,-0.0448 v 0.11713 q -0.05306,0.0248 -0.110243,0.0372 -0.0565,0.0124 -0.120579,0.0124 -0.174322,0 -0.276985,-0.10955 -0.102664,-0.10956 -0.102664,-0.29559 0,-0.18879 0.103353,-0.29697 0.104041,-0.10818 0.284564,-0.10818 0.05857,0 0.114378,0.0124 0.05581,0.0117 0.108176,0.0358 z"
style="font-size:1.41111112px;stroke-width:0.26458332"
id="path6846"
inkscape:connector-curvature="0" />
<path
d="m 38.216941,290.73566 h 0.126779 v 1.07211 h -0.126779 z"
style="font-size:1.41111112px;stroke-width:0.26458332"
id="path6848"
inkscape:connector-curvature="0" />
<path
d="m 39.269073,291.39022 v 0.062 h -0.58291 q 0.0083,0.13091 0.07855,0.19981 0.07097,0.0682 0.197059,0.0682 0.07304,0 0.141249,-0.0179 0.0689,-0.0179 0.136426,-0.0537 v 0.11989 q -0.06821,0.0289 -0.139871,0.0441 -0.07166,0.0152 -0.145383,0.0152 -0.184657,0 -0.292833,-0.10749 -0.107487,-0.10748 -0.107487,-0.29076 0,-0.18948 0.101975,-0.30041 0.102664,-0.11163 0.276297,-0.11163 0.155718,0 0.245979,0.1006 0.09095,0.0999 0.09095,0.27216 z m -0.12678,-0.0372 q -0.0014,-0.10404 -0.05857,-0.16606 -0.0565,-0.062 -0.150206,-0.062 -0.106109,0 -0.170188,0.06 -0.06339,0.0599 -0.07304,0.16881 z"
style="font-size:1.41111112px;stroke-width:0.26458332"
id="path6850"
inkscape:connector-curvature="0" />
<path
d="m 39.827867,291.41985 q -0.153651,0 -0.212906,0.0351 -0.05926,0.0351 -0.05926,0.11989 0,0.0675 0.0441,0.10749 0.04479,0.0393 0.121268,0.0393 0.105419,0 0.168809,-0.0744 0.06408,-0.0751 0.06408,-0.19913 v -0.0283 z m 0.25287,-0.0524 v 0.44028 h -0.126779 v -0.11713 q -0.04341,0.0703 -0.108176,0.10404 -0.06477,0.0331 -0.158474,0.0331 -0.118512,0 -0.188792,-0.0661 -0.06959,-0.0668 -0.06959,-0.17846 0,-0.13023 0.08682,-0.19637 0.08751,-0.0661 0.260449,-0.0661 h 0.177767 v -0.0124 q 0,-0.0875 -0.05788,-0.13505 -0.05719,-0.0482 -0.16123,-0.0482 -0.06615,0 -0.128847,0.0159 -0.0627,0.0159 -0.120578,0.0475 v -0.11713 q 0.06959,-0.0269 0.135048,-0.04 0.06546,-0.0138 0.127468,-0.0138 0.167432,0 0.250114,0.0868 0.08268,0.0868 0.08268,0.26321 z"
style="font-size:1.41111112px;stroke-width:0.26458332"
id="path6852"
inkscape:connector-curvature="0" />
<path
d="m 40.789049,291.15458 q -0.02136,-0.0124 -0.04685,-0.0179 -0.02481,-0.006 -0.05512,-0.006 -0.107487,0 -0.165364,0.0703 -0.05719,0.0696 -0.05719,0.20051 v 0.40652 h -0.127468 v -0.7717 h 0.127468 v 0.11989 q 0.03996,-0.0703 0.104042,-0.10404 0.06408,-0.0345 0.155718,-0.0345 0.01309,0 0.02894,0.002 0.01585,0.001 0.03514,0.005 z"
style="font-size:1.41111112px;stroke-width:0.26458332"
id="path6854"
inkscape:connector-curvature="0" />
<path
d="m 41.272741,291.41985 q -0.153652,0 -0.212907,0.0351 -0.05926,0.0351 -0.05926,0.11989 0,0.0675 0.0441,0.10749 0.04479,0.0393 0.121268,0.0393 0.10542,0 0.168809,-0.0744 0.06408,-0.0751 0.06408,-0.19913 v -0.0283 z m 0.25287,-0.0524 v 0.44028 h -0.12678 v -0.11713 q -0.04341,0.0703 -0.108176,0.10404 -0.06477,0.0331 -0.158474,0.0331 -0.118512,0 -0.188792,-0.0661 -0.06959,-0.0668 -0.06959,-0.17846 0,-0.13023 0.08682,-0.19637 0.08751,-0.0661 0.260449,-0.0661 h 0.177767 v -0.0124 q 0,-0.0875 -0.05788,-0.13505 -0.05719,-0.0482 -0.16123,-0.0482 -0.06615,0 -0.128847,0.0159 -0.0627,0.0159 -0.120578,0.0475 v -0.11713 q 0.06959,-0.0269 0.135048,-0.04 0.06546,-0.0138 0.127468,-0.0138 0.167432,0 0.250114,0.0868 0.08268,0.0868 0.08268,0.26321 z"
style="font-size:1.41111112px;stroke-width:0.26458332"
id="path6856"
inkscape:connector-curvature="0" />
<path
d="m 42.428226,291.34199 v 0.46578 h -0.12678 v -0.46164 q 0,-0.10956 -0.04272,-0.16399 -0.04272,-0.0544 -0.128158,-0.0544 -0.102664,0 -0.161919,0.0654 -0.05926,0.0655 -0.05926,0.17846 v 0.43615 h -0.127468 v -0.7717 h 0.127468 v 0.11989 q 0.04548,-0.0696 0.106798,-0.10404 0.06201,-0.0345 0.142627,-0.0345 0.132981,0 0.201194,0.0827 0.06821,0.082 0.06821,0.24184 z"
style="font-size:1.41111112px;stroke-width:0.26458332"
id="path6858"
inkscape:connector-curvature="0" />
<path
d="m 43.236445,291.0657 v 0.11851 q -0.05374,-0.0296 -0.108176,-0.0441 -0.05374,-0.0152 -0.108865,-0.0152 -0.123335,0 -0.191547,0.0786 -0.06821,0.0779 -0.06821,0.21911 0,0.14125 0.06821,0.2198 0.06821,0.0779 0.191547,0.0779 0.05512,0 0.108865,-0.0145 0.05443,-0.0152 0.108176,-0.0448 v 0.11713 q -0.05306,0.0248 -0.110243,0.0372 -0.0565,0.0124 -0.120579,0.0124 -0.174321,0 -0.276985,-0.10955 -0.102664,-0.10956 -0.102664,-0.29559 0,-0.18879 0.103353,-0.29697 0.104042,-0.10818 0.284565,-0.10818 0.05857,0 0.114377,0.0124 0.05581,0.0117 0.108176,0.0358 z"
style="font-size:1.41111112px;stroke-width:0.26458332"
id="path6860"
inkscape:connector-curvature="0" />
<path
d="m 44.117011,291.39022 v 0.062 h -0.58291 q 0.0083,0.13091 0.07855,0.19981 0.07097,0.0682 0.19706,0.0682 0.07304,0 0.141249,-0.0179 0.0689,-0.0179 0.136425,-0.0537 v 0.11989 q -0.06821,0.0289 -0.13987,0.0441 -0.07166,0.0152 -0.145383,0.0152 -0.184658,0 -0.292834,-0.10749 -0.107487,-0.10748 -0.107487,-0.29076 0,-0.18948 0.101975,-0.30041 0.102664,-0.11163 0.276297,-0.11163 0.155718,0 0.24598,0.1006 0.09095,0.0999 0.09095,0.27216 z m -0.126779,-0.0372 q -0.0014,-0.10404 -0.05857,-0.16606 -0.0565,-0.062 -0.150206,-0.062 -0.106109,0 -0.170188,0.06 -0.06339,0.0599 -0.07304,0.16881 z"
style="font-size:1.41111112px;stroke-width:0.26458332"
id="path6862"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB