diff --git a/.github/workflows/kicad-pcm-simple.bak b/.github/workflows/kicad-pcm-simple.bak deleted file mode 100644 index 910f1ac..0000000 --- a/.github/workflows/kicad-pcm-simple.bak +++ /dev/null @@ -1,43 +0,0 @@ ---- -# This is a workflow to generate the zip file and metadata.json for KiCAD PCM -# https://gitlab.com/kicad/addons/metadata/-/merge_requests/14 - -name: KiCAD PCM packaging -on: # yamllint disable-line rule:truthy - release: - branches: [main] - types: - - published - workflow_dispatch: - -jobs: - create_archive: - runs-on: ubuntu-latest - steps: - - name: Get latest tag - uses: oprypin/find-latest-tag@v1 - with: - repository: Liangtie/kicad-amf-plugin - releases-only: true - id: latest-release - - - name: Checkout repo - uses: actions/checkout@v3 - - - name: Setup env - run: pip3 install -r ./requirements-dev.txt - - - name: Unittest - run: pytest - - - name: Create archive - run: sh ./PCM/create_pcm_archive.sh ${{ steps.latest-release.outputs.tag }} - - - name: Upload zip as asset to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: ./PCM/KiCAD-PCM-${{ steps.latest-release.outputs.tag }}.zip - asset_name: KiCAD-PCM-${{ steps.latest-release.outputs.tag }}.zip - overwrite: true - tag: ${{ steps.latest-release.outputs.tag }} diff --git a/.github/workflows/kicad-pcm.yml b/.github/workflows/kicad-pcm.yml index 07fd6a1..9029375 100644 --- a/.github/workflows/kicad-pcm.yml +++ b/.github/workflows/kicad-pcm.yml @@ -2,8 +2,8 @@ # This is a workflow to generate the zip file and metadata.json for KiCAD PCM # https://gitlab.com/kicad/addons/metadata/-/merge_requests/14 -name: KiCAD PCM packaging and trigger kicad-addone -on: # yamllint disable-line rule:truthy +name: KiCAD PCM packaging +on: # yamllint disable-line rule:truthy release: branches: [main] types: @@ -24,12 +24,6 @@ jobs: - name: Checkout repo uses: actions/checkout@v3 - - name: Setup env - run: pip3 install -r ./requirements-dev.txt - - - name: Unittest - run: pytest - - name: Create archive run: sh ./PCM/create_pcm_archive.sh ${{ steps.latest-release.outputs.tag }} diff --git a/.gitignore b/.gitignore deleted file mode 100644 index d5ff9e8..0000000 --- a/.gitignore +++ /dev/null @@ -1,151 +0,0 @@ -led / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -db_build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ -tmp -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py -.idea -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -jlcpcb -corrections -dev - -# vscode ignore -.vscode/ - -# OS cruft -.DS_Store - -PCM/archive diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 3854349..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v2.3.0 - hooks: - - id: check-yaml - - id: end-of-file-fixer - - id: trailing-whitespace - - repo: https://github.com/psf/black - rev: 22.10.0 - hooks: - - id: black diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md deleted file mode 100644 index 3e41203..0000000 --- a/DEVELOPMENT.md +++ /dev/null @@ -1,42 +0,0 @@ -# Building kicad-amf-plugin - -## Preparation - -1. Install wxBuilder - -https://github.com/wxFormBuilder/wxFormBuilder - -2. Install gettext - -https://mlocati.github.io/articles/gettext-iconv-windows.html - -3. Install POedit - -https://poedit.net/download - -## Python env - -Locate the python shipped with KiCad (e.g C:\Program Files\KiCad\7.0\bin\python) - -```sh -cd C:\Program Files\KiCad\7.0\bin -python -m venv .venv -source .venv/scripts/activate - -``` - -## Update translation - -1. Extract po files from py - -```sh -xgettext.exe xxx.py -``` - -2. Edit the po files in Poedit - -## Debug - -The **main**.py is the entry point for debugging - -## Deploy diff --git a/kicad_amf_plugin/icon/Huaqiu.png b/Huaqiu.png similarity index 100% rename from kicad_amf_plugin/icon/Huaqiu.png rename to Huaqiu.png diff --git a/PCM/create_pcm_archive.sh b/PCM/create_pcm_archive.sh index 4126fd2..5b40cd5 100644 --- a/PCM/create_pcm_archive.sh +++ b/PCM/create_pcm_archive.sh @@ -1,61 +1,46 @@ #!/bin/sh -# heavily inspired by https://github.com/4ms/4ms-kicad-lib/blob/master/PCM/make_archive.sh +# inspired by https://github.com/Bouni/kicad-jlcpcb-tools/blob/main/PCM/create_pcm_archive.sh VERSION=$1 -PRJECT_ROOT=`pwd` -PCM_ROOT="$PRJECT_ROOT/PCM" -ACHIEVE_PATH="$PRJECT_ROOT/PCM/archive" -PLUGIN_PATH="$ACHIEVE_PATH/plugins" -RESOURCE_PATH="$ACHIEVE_PATH/resources" -OUTPUT_ZIP_PATH="$PCM_ROOT/KiCAD-PCM-$VERSION.zip" - - echo "Clean up old files" -rm -f $PCM_ROOT/*.zip -rm -rf $PLUGIN_PATH +rm -f PCM/*.zip +rm -rf PCM/archive -TRANSLATION_PATH="$PRJECT_ROOT/kicad_amf_plugin/language/geni18n.py" -echo "Excuting the translation script : $TRANSLATION_PATH" -python3 $TRANSLATION_PATH - echo "Create folder structure for ZIP" -mkdir -p $PLUGIN_PATH -mkdir -p $RESOURCE_PATH - -echo "Copy plugin to destination" +mkdir -p PCM/archive/plugins +mkdir -p PCM/archive/resources -for i in __init__.py __main__.py kicad_amf_plugin - do cp -r $i $PLUGIN_PATH -done +echo "Copy files to destination" +cp VERSION PCM/archive/plugins +cp *.py PCM/archive/plugins +cp *.png PCM/archive/plugins +cp config.json PCM/archive/plugins +cp PCM/icon.png PCM/archive/resources +cp PCM/metadata.template.json PCM/archive/metadata.json -for i in `find $PLUGIN_PATH -iname __pycache__` ; do rm -rf $i ; done - -echo "Write version to achieve" -echo $VERSION > $PLUGIN_PATH/VERSION - -echo "Copy resource to destination" -cp $PCM_ROOT/icon.png $RESOURCE_PATH -META_DATA_PATH=$ACHIEVE_PATH/metadata.json -cp $PCM_ROOT/metadata.template.json $META_DATA_PATH +echo "Write version info to file" +echo $VERSION > PCM/archive/plugins/VERSION echo "Modify archive metadata.json" -sed -i "s/VERSION_HERE/$VERSION/g" $META_DATA_PATH -sed -i "s/\"kicad_version\": \"6.0\",/\"kicad_version\": \"6.0\"/g" $META_DATA_PATH -sed -i "/SHA256_HERE/d" $META_DATA_PATH -sed -i "/DOWNLOAD_SIZE_HERE/d" $META_DATA_PATH -sed -i "/DOWNLOAD_URL_HERE/d" $META_DATA_PATH -sed -i "/INSTALL_SIZE_HERE/d" $META_DATA_PATH +sed -i "s/VERSION_HERE/$VERSION/g" PCM/archive/metadata.json +sed -i "s/\"kicad_version\": \"6.0\",/\"kicad_version\": \"6.0\"/g" PCM/archive/metadata.json +sed -i "/SHA256_HERE/d" PCM/archive/metadata.json +sed -i "/DOWNLOAD_SIZE_HERE/d" PCM/archive/metadata.json +sed -i "/DOWNLOAD_URL_HERE/d" PCM/archive/metadata.json +sed -i "/INSTALL_SIZE_HERE/d" PCM/archive/metadata.json echo "Zip PCM archive" -cd $ACHIEVE_PATH -zip -r $OUTPUT_ZIP_PATH . +cd PCM/archive +zip -r ../KiCAD-PCM-$VERSION.zip . +cd ../.. echo "Gather data for repo rebuild" echo VERSION=$VERSION >> $GITHUB_ENV -echo DOWNLOAD_SHA256=$(shasum --algorithm 256 $OUTPUT_ZIP_PATH | xargs | cut -d' ' -f1) >> $GITHUB_ENV -echo DOWNLOAD_SIZE=$(ls -l $OUTPUT_ZIP_PATH | xargs | cut -d' ' -f5) >> $GITHUB_ENV -echo DOWNLOAD_URL="https:\/\/github.com\/Bouni\/kicad-jlcpcb-tools\/releases\/download\/$VERSION\/KiCAD-PCM-$VERSION.zip" >> $GITHUB_ENV -echo INSTALL_SIZE=$(unzip -l $OUTPUT_ZIP_PATH | tail -1 | xargs | cut -d' ' -f1) >> $GITHUB_ENV +echo DOWNLOAD_SHA256=$(shasum --algorithm 256 PCM/KiCAD-PCM-$VERSION.zip | xargs | cut -d' ' -f1) >> $GITHUB_ENV +echo DOWNLOAD_SIZE=$(ls -l PCM/KiCAD-PCM-$VERSION.zip | xargs | cut -d' ' -f5) >> $GITHUB_ENV +echo DOWNLOAD_URL="https:\/\/github.com\/SYSUeric66\/kicad-amf-plugin\/releases\/download\/$VERSION\/KiCAD-PCM-$VERSION.zip" >> $GITHUB_ENV +echo INSTALL_SIZE=$(unzip -l PCM/KiCAD-PCM-$VERSION.zip | tail -1 | xargs | cut -d' ' -f1) >> $GITHUB_ENV + diff --git a/PCM/metadata.template.json b/PCM/metadata.template.json index be33730..b0f454a 100644 --- a/PCM/metadata.template.json +++ b/PCM/metadata.template.json @@ -1,33 +1,33 @@ -{ - "$schema": "https://go.kicad.org/pcm/schemas/v1", - "name": "KiCAD AMF tools", - "description": "A NextPCB Active Manufacturing addone for KiCAD", - "description_full": "Query price and place order", - "identifier": "com.github.SYSUeric66.kicad-amf-plugin", - "type": "plugin", - "author": { - "name": "SYSUeric66", - "contact": { - "email": "jzzhuang666@gmail.com" - } - }, - "maintainer": { - "name": "SYSUeric66", - "contact": { - "email": "jzzhuang666@gmail.com" - } - }, - "license": "GPL-3.0", - "resources": { - "Github": "https://github.com/SYSUeric66/kicad-amf-plugin" - }, - "versions": [{ - "version": "VERSION_HERE", - "status": "testing", - "kicad_version": "6.0", - "download_sha256": "SHA256_HERE", - "download_size": DOWNLOAD_SIZE_HERE, - "download_url": "DOWNLOAD_URL_HERE", - "install_size": INSTALL_SIZE_HERE - }] +{ + "$schema": "https://go.kicad.org/pcm/schemas/v1", + "name": "KiCAD AMF tools", + "description": "A NextPCB Active Manufacturing addone for KiCAD", + "description_full": "Query price and place order", + "identifier": "com.github.SYSUeric66.kicad-amf-plugin", + "type": "plugin", + "author": { + "name": "SYSUeric66", + "contact": { + "email": "jzzhuang666@gmail.com" + } + }, + "maintainer": { + "name": "SYSUeric66", + "contact": { + "email": "jzzhuang666@gmail.com" + } + }, + "license": "GPL-3.0", + "resources": { + "Github": "https://github.com/SYSUeric66/kicad-amf-plugin" + }, + "versions": [{ + "version": "VERSION_HERE", + "status": "testing", + "kicad_version": "6.0", + "download_sha256": "SHA256_HERE", + "download_size": DOWNLOAD_SIZE_HERE, + "download_url": "DOWNLOAD_URL_HERE", + "install_size": INSTALL_SIZE_HERE + }] } \ No newline at end of file diff --git a/__init__.py b/__init__.py index 0474a1a..8b895fa 100644 --- a/__init__.py +++ b/__init__.py @@ -1,15 +1,8 @@ -import sys -import os +from .plugin import Plugin try: - PLUGIN_ROOT = os.path.dirname(os.path.abspath(__file__)) - if PLUGIN_ROOT not in sys.path: - sys.path.append(PLUGIN_ROOT) - from .kicad_amf_plugin.plugin.kicad_amf_action_plugin import KiCadAmfActionPlugin - - KiCadAmfActionPlugin().register() + Plugin().register() except Exception as e: import logging - logger = logging.getLogger() logger.debug(repr(e)) diff --git a/__main__.py b/__main__.py deleted file mode 100644 index 204337b..0000000 --- a/__main__.py +++ /dev/null @@ -1,4 +0,0 @@ -if __name__ == "__main__": - from kicad_amf_plugin.plugin._main import _main - - _main() diff --git a/config.json b/config.json new file mode 100644 index 0000000..e545641 --- /dev/null +++ b/config.json @@ -0,0 +1,43 @@ +{ + "ui_param": { }, + "rule": { + "silkscreen":{ + "Green":["White"], + "Red":["White"], + "Yellow":["White"], + "Blue":["White"], + "White":["Black"], + "Matte Black":["White"], + "Black":["White"] + }, + "tg":{ + "showNoTG":["1","2"], + "showTG":["4","6","8","10","12","14","16","18","20"], + "1":["None"], + "2":["None"], + "4":["TG130","TG150"], + "6":["TG150","TG170"], + "8":["TG150","TG170"], + "10":["TG170"], + "12":["TG170"], + "14":["TG170"], + "16":["TG170"], + "18":["TG170"], + "20":["TG170"] + }, + "thickness":{ + "default":[14, "1.6", "2.0"], + "1":["0.6","0.8","1.0","1.2","1.6"], + "2":["0.6","0.8","1.0","1.2","1.6"], + "4":["0.6","0.8","1.0","1.2","1.6","2.0","2.5"], + "6":["1.0","1.2","1.6","2.0","2.5"], + "8":["1.2","1.6","2.0","2.5"], + "10":["1.2","1.6","2.0","2.5"], + "12":["1.6","2.0","2.5"], + "14":["1.6","2.0","2.5","3.0"], + "16":["2.0","2.5","3.0"], + "18":["2.0","2.5","3.0","3.2"], + "20":["2.0","2.5","3.0","3.2"] + } + } +} \ No newline at end of file diff --git a/dialog_amf.py b/dialog_amf.py new file mode 100644 index 0000000..a10adc2 --- /dev/null +++ b/dialog_amf.py @@ -0,0 +1,674 @@ +import os +import wx +import wx.lib.masked as masked +import urllib.request +import urllib.parse +import json +import re +from .urlencodeform import UrlEncodeForm +from collections import defaultdict +import locale +from datetime import datetime +import requests +import webbrowser + +import pcbnew +from . import dialog_amf_base +from .fabrication import Fabrication +import gettext +_ = gettext.gettext + +from. import validators + +# Implementing AmfDialogBase +class AmfDialog( dialog_amf_base.AmfDialogBase ): + def __init__( self, parent ): + dialog_amf_base.AmfDialogBase.__init__( self, parent ) + + self.board = pcbnew.GetBoard() + + boardWidth = pcbnew.ToMM(self.board.GetBoardEdgesBoundingBox().GetWidth()) + boardHeight = pcbnew.ToMM(self.board.GetBoardEdgesBoundingBox().GetHeight()) + designSettings = self.board.GetDesignSettings() + boardThickness = designSettings.GetBoardThickness() + minTraceWidth = designSettings.m_TrackMinWidth + minTraceClearance = designSettings.m_MinClearance + minHoleSize = designSettings.m_MinThroughDrill + layerCount = self.board.GetCopperLayerCount() + self.load_config_file() + self.m_layerCountCtrl.SetSelection(self.m_layerCountCtrl.FindString(str(layerCount))) + self.OnThicknessChangebyLayer(None) + self.m_layerCountCtrl.Enabled = False + #self.m_placeOrderButton.Enabled = False + self.m_sizeXCtrl.SetValue(str(boardWidth)) + self.m_sizeXCtrl.SetEditable(False) + self.m_sizeYCtrl.SetValue(str(boardHeight)) + self.m_sizeYCtrl.SetEditable(False) + # self.m_asmSizeXCtrl.SetValue(str(boardWidth)) + # self.m_asmSizeXCtrl.SetEditable(False) + # self.m_asmSizeYCtrl.SetValue(str(boardHeight)) + # self.m_asmSizeYCtrl.SetEditable(False) + self.SetBoardThickness(pcbnew.ToMM(boardThickness)) + self.SetMinTrace(pcbnew.ToMils(minTraceWidth), pcbnew.ToMils(minTraceClearance)) + self.SetMinHole(pcbnew.ToMM(minHoleSize)) + self.m_pcbPackaingCtrl.SetSelection(0) + self.OnPcbPackagingChanged(None) + self.m_marginModeCtrl.SetSelection(0) + self.OnMarginModeChanged(None) + self.m_surfaceProcessCtrl.SetSelection(0) + self.OnSurfaceProcessChanged(None) + self.numericValidator = validators.NumericTextCtrlValidator() + self.m_panelizeXCtrl.SetValidator(self.numericValidator) + self.m_panelizeYCtrl.SetValidator(self.numericValidator) + self.floatValidator = validators.FloatTextCtrlValidator() + self.m_marginValueCtrl.SetValidator(self.floatValidator) + if layerCount == 2: + self.m_innerCopperThicknessLabel.Enabled = False + self.m_innerCopperThicknessCtrl.Enabled = False + self.m_blindViaLabel.Enabled = False + self.m_blindViaCtrl.Enabled = False + else: + self.m_innerCopperThicknessLabel.Enabled = True + self.m_innerCopperThicknessCtrl.Enabled = True + self.m_blindViaLabel.Enabled = True + self.m_blindViaCtrl.Enabled = True + self.m_template.SetSelection(0) + self.OnTemplateChanged(None) + self.OnPcbQuantityChanged(None) + self.OnHDIChanged(None) + #self.OnMaskColorChange(None) + self.fabrication = None + # self.SetSMTInfo() + # self.SetDIPInfo() + + # Handlers for AmfDialogBase events. + def OnTemplateChanged( self, event ): + if self.m_template.GetSelection() == 0 and self.m_notebook.PageCount > 1: + self.m_notebook.RemovePage(1) + elif self.m_template.GetSelection() == 1 and self.m_notebook.PageCount == 1: + self.m_notebook.AddPage( self.m_panelAsm, _(u"PCB Assembly"), True ) + + def OnPcbPackagingChanged(self, event): + if self.m_pcbPackaingCtrl.GetSelection() == 0: + self.m_sizeLabel.SetLabel('Size (single)') + self.m_quantityLbel.SetLabel('Qty(single)') + self.m_quantityUnit.SetLabel('Pcs') + self.m_panelizeRuleLbel.Enabled = False + self.m_panelizeXLabel.Enabled = False + self.m_panelizeXCtrl.Enabled = False + self.m_panelizeXUnit.Enabled = False + self.m_panelizeYLabel.Enabled = False + self.m_panelizeYCtrl.Enabled = False + self.m_panelizeYUnit.Enabled = False + self.m_marginLabel.Enabled = True + self.m_marginModeCtrl.Enabled = True + self.OnMarginModeChanged(None) + else: + self.m_sizeLabel.SetLabel('Size (set)') + self.m_quantityLbel.SetLabel('Qty(Set)') + self.m_quantityUnit.SetLabel('Set') + self.m_panelizeRuleLbel.Enabled = True + self.m_panelizeXLabel.Enabled = True + self.m_panelizeXCtrl.Enabled = True + self.m_panelizeXCtrl.SetEditable(True) + self.m_panelizeXUnit.Enabled = True + self.m_panelizeYLabel.Enabled = True + self.m_panelizeYCtrl.Enabled = True + self.m_panelizeYCtrl.SetEditable(True) + self.m_panelizeYUnit.Enabled = True + self.m_marginLabel.Enabled = True + self.m_marginModeCtrl.Enabled = True + self.OnMarginModeChanged(None) + + def OnMarginModeChanged( self, event ): + if self.m_marginModeCtrl.GetSelection() == 0: + self.m_marginValueCtrl.Enabled = False + self.m_marginValueUnit.Enabled = False + else: + self.m_marginValueCtrl.Enabled = True + self.m_marginValueCtrl.SetEditable(True) + self.m_marginValueUnit.Enabled = True + + def OnSurfaceProcessChanged( self, event ): + if self.m_surfaceProcessCtrl.GetSelection() == 2: + self.m_goldThicknessLabel.Enabled = True + self.m_goldThicknessCtrl.Enabled = True + else: + self.m_goldThicknessLabel.Enabled = False + self.m_goldThicknessCtrl.Enabled = False + + def OnPanelizeXChanged( self, event ): + if not self.m_panelizeXCtrl.Validate(): + wx.MessageBox("Panel Type X value isn't valid. Please input valid value.", "Error", wx.OK | wx.ICON_ERROR) + return + # self.m_asmQuantityCtrl.SetValue(str(self.GetPcbQuantity())) + + def OnPanelizeYChanged( self, event ): + if not self.m_panelizeYCtrl.Validate(): + wx.MessageBox("Panel Type Y value isn't valid. Please input valid value.", "Error", wx.OK | wx.ICON_ERROR) + return + # self.m_asmQuantityCtrl.SetValue(str(self.GetPcbQuantity())) + + def OnPcbQuantityChanged( self, event ): + # self.m_asmQuantityCtrl.SetValue(str(self.GetPcbQuantity())) + return + + def OnHDIChanged( self, event ): + if self.m_blindViaCtrl.GetSelection() == 1: + self.m_hdiStructureLabel.Enabled = True + self.m_hdiStructureCtrl.Enabled = True + else: + self.m_hdiStructureLabel.Enabled = False + self.m_hdiStructureCtrl.Enabled = False + + def OnReportChanged( self, event ): + if self.m_deliveryReportCtrl.GetSelection() == 0 and self.m_analysisReportCtrl.GetSelection() == 0: + self.m_reportFormatLabel.Enabled = False + self.m_reportFormatCtrl.Enabled = False + else: + self.m_reportFormatLabel.Enabled = True + self.m_reportFormatCtrl.Enabled = True + + def OnMaskColorChange(self, event): + self.m_silkscreenColorCtrl.Clear() + mask_color = self.m_solderColorCtrl.GetString(self.m_solderColorCtrl.GetSelection()) + val_list = self.config_json["rule"]["silkscreen"][mask_color] + self.m_silkscreenColorCtrl.Append(val_list) + self.m_silkscreenColorCtrl.SetSelection( 0 ) + + def OnThicknessChangebyLayer(self, event): + layer = self.m_layerCountCtrl.GetString(self.m_layerCountCtrl.GetSelection()) + self.m_boardThicknessCtrl.Clear() + val_list = self.config_json["rule"]["thickness"][layer] + self.m_boardThicknessCtrl.Append(val_list) + + + def load_config_file(self): + """Load config from config.json""" + if not os.path.isfile(os.path.join(os.path.dirname(__file__), "config.json")): + wx.MessageBox("Load config json file failed.Please reinstall plugin.", "Error", wx.OK | wx.ICON_ERROR) + return + with open(os.path.join(os.path.dirname(__file__), "config.json")) as j: + self.config_json = json.load(j) + + def init_fabrication(self): + """Initialize the fabrication""" + if not self.fabrication: + self.fabrication = Fabrication(self) + + # def OnDoDIPChanged( self, event ): + # if self.m_doDIPCtrl.GetSelection() == 0: + # self.m_dipComponentKindsCtrl.SetEditable(False) + # self.m_dipPadCountCtrl.SetEditable(False) + # else: + # self.m_dipComponentKindsCtrl.SetEditable(True) + # self.m_dipPadCountCtrl.SetEditable(True) + + def GetInfoFromSetting(self): + if self.m_pcbPackaingCtrl.GetSelection() == 1 or self.m_pcbPackaingCtrl.GetSelection() == 2: + if not self.m_panelizeXCtrl.Validate(): + wx.MessageBox("Panel Type X value isn't valid. Please input valid value.", "Error", wx.OK | wx.ICON_ERROR) + return + if not self.m_panelizeYCtrl.Validate(): + wx.MessageBox("Panel Type Y value isn't valid. Please input valid value.", "Error", wx.OK | wx.ICON_ERROR) + return + if self.m_marginValueCtrl.Enabled: + if not self.m_marginValueCtrl.Validate(): + wx.MessageBox("Break-away Rail value isn't valid. Please input valid value.", "Error", wx.OK | wx.ICON_ERROR) + return + + form = UrlEncodeForm() + form.add_field('service', 'pcb') + form.add_field('plate_type', 'Fr-4') #self.m_baseMaterialCtrl.GetString(self.m_baseMaterialCtrl.GetSelection())) + layercount = int(self.m_layerCountCtrl.GetString(self.m_layerCountCtrl.GetSelection())) + form.add_field('blayer', str(layercount)) + form.add_field('board_tg', 'TG130') #TODO + if self.m_pcbPackaingCtrl.GetSelection() == 0: + form.add_field('units', '1') + elif self.m_pcbPackaingCtrl.GetSelection() == 1: + form.add_field('units', '3') + else: + form.add_field('units', '2') + form.add_field('blength', str(round(self.GetPcbLength() / 10, 2))) + form.add_field('bwidth', str(round(self.GetPcbWidth() / 10, 2))) + if self.m_pcbPackaingCtrl.GetSelection() == 1 or self.m_pcbPackaingCtrl.GetSelection() == 2: + form.add_field('layoutx', self.m_panelizeXCtrl.GetValue()) + form.add_field('layouty', self.m_panelizeYCtrl.GetValue()) + form.add_field('bcount', self.m_quantityCtrl.GetString(self.m_quantityCtrl.GetSelection())) + form.add_field('sidedirection', self.GetMarginMode()) + if self.m_marginModeCtrl.GetSelection() != 0: + form.add_field('sidewidth', self.m_marginValueCtrl.GetValue()) + form.add_field('bheight', self.m_boardThicknessCtrl.GetString(self.m_boardThicknessCtrl.GetSelection())) + form.add_field('copper', str(self.GetOuterCopperThickness())) + if layercount > 2: + form.add_field('insidecopper', str(self.GetInnerCopperThickness())) + if self.m_stackupCtrl.GetSelection() == 0: + form.add_field('pressing', '') + else: + form.add_field('pressing', 'Customer Specified Stack up') + else: + form.add_field('insidecopper', '0') + form.add_field('pressing', '') + form.add_field('lineweight', str(self.GetMinTraceWidthAndClearance())) + form.add_field('vias', str(self.GetMinHoleSize())) + form.add_field('color', self.m_solderColorCtrl.GetString(self.m_solderColorCtrl.GetSelection())) + form.add_field('charcolor', self.m_silkscreenColorCtrl.GetString(self.m_silkscreenColorCtrl.GetSelection())) + form.add_field('cover', self.m_solderCoverCtrl.GetString(self.m_solderCoverCtrl.GetSelection())) + form.add_field('spray', self.m_surfaceProcessCtrl.GetString(self.m_surfaceProcessCtrl.GetSelection())) + if self.m_surfaceProcessCtrl.GetSelection() == 2: + form.add_field('cjh', str(self.GetCJH())) + form.add_field('impendance', str(self.m_impedanceCtrl.GetSelection())) + form.add_field('bankong', str(self.m_halfHoleCtrl.GetSelection())) + form.add_field('blind', self.GetBlindValue()) + form.add_field('via_in_pad', self.GetViaInPad()) + form.add_field('test', self.GetTestMethod()) + form.add_field('shipment_report', str(self.m_deliveryReportCtrl.GetSelection())) + form.add_field('slice_report', str(self.m_analysisReportCtrl.GetSelection())) + form.add_field('report_type', str(self.GetReportType())) + form.add_field('beveledge', str(self.m_goldFingerCtrl.GetSelection())) + form.add_field('review_file', self.GetReviewFile()) + form.add_field('has_period', self.GetHasPeriod()) + if self.m_ulMarkCtrl.GetSelection() != 0: + form.add_field('period_format', self.GetPeriodFormat()) + form.add_field('film_report', str(self.m_filmCtrl.GetSelection())) + form.add_field('pcb_note', self.m_specialRequestsCtrl.GetValue()) + + form.add_field('region_id', '211') #TODO + form.add_field('country', '211') #TODO + form.add_field('express', '31') #TODO + # form.add_field('express', '0') + # form.add_field('expresstime', '3-5%20days') + # form.add_field('calc_type', '0') + # form.add_field('deltime', '72%20hours') + # form.add_field('activity_code', '') + # form.add_field('active', '') + # form.add_field('history_pcb_order_sn', '0') + # form.add_field('pbnum', '1') + # form.add_field('isgerber', '1') + # form.add_field('thermalc', '') + # form.add_field('rogers', '') + # form.add_field('holedensity', '0') + # form.add_field('cjarea', '0') + # form.add_field('testpoint', '0') + # form.add_field('zknum', '0') + # form.add_field('baobian', '') + # form.add_field('pcscount', '20') + # form.add_field('pcb_po_number', '') + # form.add_field('pcb_note', '') + # form.add_field('review_file', '0') + # form.add_field('cross_board', '1') + # form.add_field('user_stamp', '3') + # form.add_field('paper', '1') + # form.add_field('file_standard', '2') + # form.add_field('acceptance', '1') + + self.form = form + + def OnUpdatePrice( self, event ): + self.GetInfoFromSetting() + self.form.convert_to_dict() + + self.form.make_result() + url = 'https://www.nextpcb.com/ajax/valuation' + req1 = urllib.request.Request(url, data=self.form.form_data) + fp = urllib.request.urlopen(req1) + data = fp.read() + self.m_priceDetailsViewListCtrl.DeleteAllItems() + encoding = fp.info().get_content_charset('utf-8') + quote = json.loads(data.decode(encoding)) + # text_file = open("d:\QuotePCB.txt", "w") + # n = text_file.write(data.decode(encoding)) + # text_file.close() + + if quote['code'] != 200: + wx.MessageBox(quote['msg'], "Error", wx.OK | wx.ICON_ERROR) + return + + data = ['Fabrication:', ''] + self.m_priceDetailsViewListCtrl.AppendItem(data) + + if 'discount' in quote['data']: + value = '$' + str(quote['data']['pcb_total_original']) + data = ['PCB Price', value] + self.m_priceDetailsViewListCtrl.AppendItem(data) + + value = '$' + str(quote['data']['discount']['pcb']['discount_amount']) + data =[quote['data']['discount']['pcb']['title'], value] + self.m_priceDetailsViewListCtrl.AppendItem(data) + else: + value = '$' + str(quote['data']['pcb_total']) + data = ['PCB Price', value] + self.m_priceDetailsViewListCtrl.AppendItem(data) + + #freight_value = quote['data']['freight'] + #data = ['Shipping Cost', value] + #self.m_priceDetailsViewListCtrl.AppendItem(data) + #wx.MessageBox(f"freight_value:{freight_value}.total{quote['data']['total']}", "Help", style=wx.ICON_INFORMATION) + + value = '$' + str(round(float(quote['data']['total']) - float(quote['data']['freight']), 2)) + data = ['Total', value] + self.m_priceDetailsViewListCtrl.AppendItem(data) + + value = quote['data']['delivery_date'] + data = ['Delivery Date', value] + self.m_priceDetailsViewListCtrl.AppendItem(data) + + locale.setlocale(locale.LC_ALL, '') + deldate = str(quote['data']['delivery_date'][0:10]) + fabDueDate = str((datetime.strptime(deldate, '%Y/%m/%d') - datetime.now()).days) + + value = str(round(quote['data']['weight'], 4)) + 'kg' + data = ['Weight', value] + self.m_priceDetailsViewListCtrl.AppendItem(data) + + value = str(round(quote['data']['list']['pcb']['area'] / 10000, 4)) + '㎡' + data = ['Area', value] + self.m_priceDetailsViewListCtrl.AppendItem(data) + + data = ['', ''] + self.m_priceDetailsViewListCtrl.AppendItem(data) + + totalPrice = round(float(quote['data']['total']) - float(quote['data']['freight']), 2) + + value = '$' + str(totalPrice) + data = ['Total Price', value] + self.m_priceDetailsViewListCtrl.AppendItem(data) + + self.m_amountCtrl.SetLabel(str(self.GetPcbQuantity())) + self.m_priceCtrl.SetLabel(str(totalPrice)) + if self.m_template.GetSelection() == 0: + self.m_dueDateCtrl.SetLabel(str(self.GetDaysFromString(fabDueDate))) + else: + self.m_dueDateCtrl.SetLabel('-') + + + def GetImagePath( self, bitmap_path ): + return os.path.join(os.path.dirname(__file__), bitmap_path) + + def GetPcbQuantity( self ): + n = int(self.m_quantityCtrl.GetString(self.m_quantityCtrl.GetSelection())) + if self.m_pcbPackaingCtrl.GetSelection() == 1 or self.m_pcbPackaingCtrl.GetSelection() == 2: + return n * int(self.m_panelizeXCtrl.GetValue()) * int(self.m_panelizeYCtrl.GetValue()) + else: + return n + + def GetPcbLength( self ): + if self.m_pcbPackaingCtrl.GetSelection() == 0: + if self.m_marginModeCtrl.GetSelection() == 1 or self.m_marginModeCtrl.GetSelection() == 3: + return float(self.m_sizeXCtrl.GetValue()) + float(self.m_marginValueCtrl.GetValue()) * 2 + else: + return float(self.m_sizeXCtrl.GetValue()) + else: + if self.m_marginModeCtrl.GetSelection() == 1 or self.m_marginModeCtrl.GetSelection() == 3: + return float(self.m_sizeXCtrl.GetValue()) * int(self.m_panelizeXCtrl.GetValue()) + float(self.m_marginValueCtrl.GetValue()) * 2 + else: + return float(self.m_sizeXCtrl.GetValue()) * int(self.m_panelizeXCtrl.GetValue()) + + def GetPcbWidth( self ): + if self.m_pcbPackaingCtrl.GetSelection() == 0: + if self.m_marginModeCtrl.GetSelection() == 1 or self.m_marginModeCtrl.GetSelection() == 3: + return float(self.m_sizeYCtrl.GetValue()) + float(self.m_marginValueCtrl.GetValue()) * 2 + else: + return float(self.m_sizeYCtrl.GetValue()) + else: + if self.m_marginModeCtrl.GetSelection() == 1 or self.m_marginModeCtrl.GetSelection() == 3: + return float(self.m_sizeYCtrl.GetValue()) * int(self.m_panelizeYCtrl.GetValue()) + float(self.m_marginValueCtrl.GetValue()) * 2 + else: + return float(self.m_sizeYCtrl.GetValue()) * int(self.m_panelizeYCtrl.GetValue()) + + def GetMarginMode( self ): + if self.m_marginModeCtrl.GetSelection() == 0: + return "N/A" + elif self.m_marginModeCtrl.GetSelection() == 1: + return "X" + elif self.m_marginModeCtrl.GetSelection() == 2: + return "Y" + elif self.m_marginModeCtrl.GetSelection() == 3: + return "XY" + else: + return "N/A" + + def GetOuterCopperThickness( self ): + if self.m_outerCopperThicknessCtrl.GetSelection() == 0: + return 1 + elif self.m_outerCopperThicknessCtrl.GetSelection() == 1: + return 2 + + def GetInnerCopperThickness( self ): + if self.m_innerCopperThicknessCtrl.GetSelection() == 0: + return 0.5 + if self.m_innerCopperThicknessCtrl.GetSelection() == 1: + return 1 + elif self.m_innerCopperThicknessCtrl.GetSelection() == 2: + return 2 + + def GetMinTraceWidthAndClearance( self ): + if self.m_minTraceWidthClearanceCtrl.GetSelection() == 0: + return 10 + elif self.m_minTraceWidthClearanceCtrl.GetSelection() == 1: + return 8 + elif self.m_minTraceWidthClearanceCtrl.GetSelection() == 2: + return 6 + elif self.m_minTraceWidthClearanceCtrl.GetSelection() == 3: + return 5 + elif self.m_minTraceWidthClearanceCtrl.GetSelection() == 4: + return 4 + elif self.m_minTraceWidthClearanceCtrl.GetSelection() == 5: + return 3.5 + else: + return 10 + + def GetMinHoleSize( self ): + if self.m_minHoleSizeCtrl.GetSelection() == 0: + return 0.3 + elif self.m_minHoleSizeCtrl.GetSelection() == 1: + return 0.25 + elif self.m_minHoleSizeCtrl.GetSelection() == 2: + return 0.2 + elif self.m_minHoleSizeCtrl.GetSelection() == 3: + return 0.15 + else: + return 0.3 + + def GetCJH( self ): + if self.m_goldThicknessCtrl.GetSelection() == 0: + return 1 + elif self.m_goldThicknessCtrl.GetSelection() == 1: + return 2 + elif self.m_goldThicknessCtrl.GetSelection() == 2: + return 3 + else: + return 1 + + def GetBlindValue( self ): + if self.m_blindViaCtrl.GetSelection() == 0: + return "0" + elif self.m_hdiStructureCtrl.GetSelection() == 0: + return "1" + elif self.m_hdiStructureCtrl.GetSelection() == 1: + return "2" + elif self.m_hdiStructureCtrl.GetSelection() == 2: + return "3" + + def GetTestMethod( self ): + if self.m_testMethodCtrl.GetSelection() == 0: + return 'Sample Test Free' + elif self.m_testMethodCtrl.GetSelection() == 1: + return 'Batch Flying Probe Test' + elif self.m_testMethodCtrl.GetSelection() == 2: + return 'Batch Fixture Test' + + def GetReviewFile( self ): + if self.m_approveWorkingGerberCtrl.GetSelection() == 0: + return '0' + else: + return '2' + + def GetHasPeriod( self ): + if self.m_ulMarkCtrl.GetSelection() == 0: + return '2' + else: + return '6' + + def GetPeriodFormat( self ): + if self.m_ulMarkCtrl.GetSelection() == 1: + return '2' + elif self.m_ulMarkCtrl.GetSelection() == 2: + return '1' + + def GetViaInPad( self ): + if self.m_padHoleCtrl.GetSelection() == 0: + return 'N/A' + else: + return 'Have' + + def GetReportType( self ): + if self.m_deliveryReportCtrl.GetSelection() == 0 and self.m_analysisReportCtrl.GetSelection() == 0: + return 0 + elif self.m_reportFormatCtrl.GetSelection() == 0: + return 2 + elif self.m_reportFormatCtrl.GetSelection() == 1: + return 1 + + def GetDaysFromString( self, str ): + numbers = re.findall('\d+', str) + if '小时' in str: + return int(int(numbers[0]) / 24) + else: + return int(numbers[0]) + + def SetBoardThickness( self, thickness ): + for i in range(self.m_boardThicknessCtrl.GetCount()): + if thickness <= float(self.m_boardThicknessCtrl.GetString(i)): + self.m_boardThicknessCtrl.SetSelection(i) + break + + def SetMinTrace( self, minTraceWidth, minTraceClearance ): + if minTraceWidth == 0 and minTraceClearance == 0: + minTrace = 6 + elif minTraceWidth == 0: + minTrace = minTraceClearance + elif minTraceClearance == 0: + minTrace = minTraceWidth + else: + minTrace = min(minTraceWidth, minTraceClearance) + + if minTrace == 0: + minTrace = 6 + self.m_minTraceWidthClearanceCtrl.SetSelection(2) + elif minTrace >= 10: + minTrace = 10 + self.m_minTraceWidthClearanceCtrl.SetSelection(0) + elif minTrace >= 8: + minTrace = 8 + self.m_minTraceWidthClearanceCtrl.SetSelection(1) + elif minTrace >= 6: + minTrace = 6 + self.m_minTraceWidthClearanceCtrl.SetSelection(2) + elif minTrace >= 5: + minTrace = 5 + self.m_minTraceWidthClearanceCtrl.SetSelection(3) + elif minTrace >= 4: + minTrace = 4 + self.m_minTraceWidthClearanceCtrl.SetSelection(4) + else: + minTrace = 3.5 + self.m_minTraceWidthClearanceCtrl.SetSelection(5) + + def SetMinHole( self, minHoleSize ): + if minHoleSize == 0: + minHoleSize = 0.3 + self.m_minHoleSizeCtrl.SetSelection(0) + elif minHoleSize >= 0.3: + minHoleSize = 0.3 + self.m_minHoleSizeCtrl.SetSelection(0) + elif minHoleSize >= 0.25: + minHoleSize = 0.25 + self.m_minHoleSizeCtrl.SetSelection(1) + elif minHoleSize >= 0.2: + minHoleSize = 0.2 + self.m_minHoleSizeCtrl.SetSelection(2) + else: + minHoleSize = 0.15 + self.m_minHoleSizeCtrl.SetSelection(3) + + def SetSMTInfo( self ): + smtPadCount = 0 + topSMT = False + bottomSMT = False + footprints = list(self.board.GetFootprints()) + footprints.sort(key=lambda x: x.GetReference()) + footprintReferecens = defaultdict(int) + for i, footprint in enumerate(footprints): + if footprint.GetAttributes() & pcbnew.FP_SMD == pcbnew.FP_SMD: + # if not footprint.HasThroughHolePads(): + if footprint.GetLayer() == pcbnew.F_Cu: + topSMT = True + elif footprint.GetLayer() == pcbnew.B_Cu: + bottomSMT = True + footprintReferecens[str(footprint.GetFPID().GetLibItemName()) + '&&&&' + footprint.GetValue().upper()] += 1 + smtPadCount += len(footprint.Pads()) + # pads = list(footprint.Pads()) + # for pad in pads: + # if pad.ShowPadAttr() == 'SMD': + # if pad.IsOnLayer(pcbnew.F_Cu) or pad.IsOnLayer(pcbnew.B_Cu): + # smtPadCount = smtPadCount + 1 + + # self.m_smtSingleDouleSideCtrl.SetSelection(1 if topSMT and bottomSMT else 0) + # self.m_smtComponentKindsCtrl.SetValue(str(len(footprintReferecens.items()))) + # self.m_smtPadCountCtrl.SetValue(str(smtPadCount)) + + def generate_fabrication_data(self, e): + """Generate fabrication data.""" + self.fabrication.fill_zones() + self.fabrication.generate_geber(None) + self.fabrication.generate_excellon() + self.fabrication.zip_gerber_excellon() + + + def OnPlaceOrder(self, e): + self.m_placeOrderButton.Enabled = False + try: + wx.BeginBusyCursor() + self.init_fabrication() + self.generate_fabrication_data(e) + self.place_order_request() + finally: + wx.EndBusyCursor() + self.m_placeOrderButton.Enabled = True + + def place_order_request(self): + zipname = f"GERBER-{self.fabrication.filename.split('.')[0]}.zip" + zipfile = os.path.join(self.fabrication.outputdir, zipname) + files = {'file': open(zipfile, 'rb')} + upload_url = "https://www.nextpcb.com/Upfile/kiCadUpFile" + self.GetInfoFromSetting() + self.form.add_field('type', 'pcbfile') + self.form.convert_to_dict() + self.form.form_dict['blength'] = str(round(self.GetPcbLength(), 2)) + self.form.form_dict['bwidth'] = str(round(self.GetPcbWidth(), 2)) + rsp = requests.post( + upload_url, + files=files, + data=self.form.form_dict + ) + urls = json.loads(rsp.content) + uat_url = str(urls['redirect']) + webbrowser.open(uat_url) + + # def SetDIPInfo( self ): + # dipPadCount = 0 + # footprints = list(self.board.GetFootprints()) + # footprints.sort(key=lambda x: x.GetReference()) + # footprintReferecens = defaultdict(int) + # for i, footprint in enumerate(footprints): + # if footprint.GetAttributes() & pcbnew.FP_THROUGH_HOLE == pcbnew.FP_THROUGH_HOLE: + # # if footprint.HasThroughHolePads(): + # footprintReferecens[str(footprint.GetFPID().GetLibItemName()) + '&&&&' + footprint.GetValue().upper()] += 1 + # dipPadCount += len(footprint.Pads()) + + # self.m_doDIPCtrl.SetSelection(1 if dipPadCount > 0 else 0) + # self.m_dipComponentKindsCtrl.SetValue(str(len(footprintReferecens.items()))) + # self.m_dipPadCountCtrl.SetValue(str(dipPadCount)) + # self.OnDoDIPChanged(None) + diff --git a/dialog_amf_base.py b/dialog_amf_base.py new file mode 100644 index 0000000..0c630f8 --- /dev/null +++ b/dialog_amf_base.py @@ -0,0 +1,659 @@ +# -*- coding: utf-8 -*- + +########################################################################### +## Python code generated with wxFormBuilder (version 3.10.1-0-g8feb16b3) +## http://www.wxformbuilder.org/ +## +## PLEASE DO *NOT* EDIT THIS FILE! +########################################################################### + +import wx +import wx.xrc +import wx.dataview + +import gettext +_ = gettext.gettext + +########################################################################### +## Class AmfDialogBase +########################################################################### + +class AmfDialogBase ( wx.Dialog ): + + def __init__( self, parent ): + wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = _(u"HQ NextPCB Active Manufacturing"), pos = wx.DefaultPosition, size = wx.Size( 800, 700 ), style = wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER ) + + self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) + + m_mainSizer = wx.BoxSizer( wx.VERTICAL ) + + m_topSizer = wx.BoxSizer( wx.HORIZONTAL ) + + m_topLeftSizer = wx.BoxSizer( wx.VERTICAL ) + + m_templateChoices = [ _(u"PCB Fabrication") ] + self.m_template = wx.Choice( self, wx.ID_ANY, wx.DefaultPosition, wx.Size( 300,-1 ), m_templateChoices, 0 ) + self.m_template.SetSelection( 0 ) + m_topLeftSizer.Add( self.m_template, 0, wx.EXPAND|wx.TOP, 5 ) + + self.m_notebook = wx.Notebook( self, wx.ID_ANY, wx.DefaultPosition, wx.Size( 300,-1 ), 0 ) + self.m_panelFab = wx.ScrolledWindow( self.m_notebook, wx.ID_ANY, wx.DefaultPosition, wx.Size( 300,-1 ), wx.HSCROLL|wx.VSCROLL ) + self.m_panelFab.SetScrollRate( 10, 10 ) + m_panelFabSizer = wx.BoxSizer( wx.VERTICAL ) + + m_fabBaseInfo = wx.StaticBoxSizer( wx.StaticBox( self.m_panelFab, wx.ID_ANY, _(u"Base Info") ), wx.VERTICAL ) + + m_fabBaseInfoSizer = wx.GridBagSizer( 0, 0 ) + m_fabBaseInfoSizer.SetFlexibleDirection( wx.BOTH ) + m_fabBaseInfoSizer.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.m_baseMaterialLabel = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"Material Type:"), wx.DefaultPosition, wx.Size( -1,-1 ), 0 ) + self.m_baseMaterialLabel.Wrap( -1 ) + + self.m_baseMaterialLabel.SetToolTip( _(u"Non-conductive base material") ) + + m_fabBaseInfoSizer.Add( self.m_baseMaterialLabel, wx.GBPosition( 0, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_baseMaterialCtrlChoices = [ _(u"FR-4") ] + self.m_baseMaterialCtrl = wx.Choice( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_baseMaterialCtrlChoices, 0 ) + self.m_baseMaterialCtrl.SetSelection( 0 ) + m_fabBaseInfoSizer.Add( self.m_baseMaterialCtrl, wx.GBPosition( 0, 1 ), wx.GBSpan( 1, 2 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_layerCountLabel = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"Layer Count:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_layerCountLabel.Wrap( -1 ) + + self.m_layerCountLabel.SetToolTip( _(u"Number of copper layers") ) + + m_fabBaseInfoSizer.Add( self.m_layerCountLabel, wx.GBPosition( 1, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_layerCountCtrlChoices = [ _(u"1"), _(u"2"), _(u"4"), _(u"6"), _(u"8"), _(u"10"), _(u"12"), _(u"14"), _(u"16"), _(u"18"), _(u"20") ] + self.m_layerCountCtrl = wx.Choice( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_layerCountCtrlChoices, 0 ) + self.m_layerCountCtrl.SetSelection( 1 ) + m_fabBaseInfoSizer.Add( self.m_layerCountCtrl, wx.GBPosition( 1, 1 ), wx.GBSpan( 1, 2 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_pcbPackaingLabel = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"Board Type:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_pcbPackaingLabel.Wrap( -1 ) + + self.m_pcbPackaingLabel.SetToolTip( _(u"The finished PCB are by single or by panel") ) + + m_fabBaseInfoSizer.Add( self.m_pcbPackaingLabel, wx.GBPosition( 2, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_pcbPackaingCtrlChoices = [ _(u"Single Piece"), _(u"Panel by Customer"), _(u"Panel by NextPCB") ] + self.m_pcbPackaingCtrl = wx.Choice( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_pcbPackaingCtrlChoices, 0 ) + self.m_pcbPackaingCtrl.SetSelection( 0 ) + m_fabBaseInfoSizer.Add( self.m_pcbPackaingCtrl, wx.GBPosition( 2, 1 ), wx.GBSpan( 1, 2 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_panelizeRuleLbel = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"Panel Type:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_panelizeRuleLbel.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_panelizeRuleLbel, wx.GBPosition( 3, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + self.m_panelizeXLabel = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"X:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_panelizeXLabel.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_panelizeXLabel, wx.GBPosition( 4, 0 ), wx.GBSpan( 1, 1 ), wx.ALIGN_RIGHT|wx.ALL, 5 ) + + self.m_panelizeXCtrl = wx.TextCtrl( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 100,-1 ), wx.TE_READONLY ) + self.m_panelizeXCtrl.SetMaxLength( 0 ) + m_fabBaseInfoSizer.Add( self.m_panelizeXCtrl, wx.GBPosition( 4, 1 ), wx.GBSpan( 1, 1 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_panelizeXUnit = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"pcs"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_panelizeXUnit.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_panelizeXUnit, wx.GBPosition( 4, 2 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + self.m_panelizeYCtrl = wx.TextCtrl( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 100,-1 ), wx.TE_READONLY ) + self.m_panelizeYCtrl.SetMaxLength( 0 ) + m_fabBaseInfoSizer.Add( self.m_panelizeYCtrl, wx.GBPosition( 5, 1 ), wx.GBSpan( 1, 1 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_panelizeYLabel = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"Y:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_panelizeYLabel.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_panelizeYLabel, wx.GBPosition( 5, 0 ), wx.GBSpan( 1, 1 ), wx.ALIGN_RIGHT|wx.ALL, 5 ) + + self.m_panelizeYUnit = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"pcs"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_panelizeYUnit.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_panelizeYUnit, wx.GBPosition( 5, 2 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + self.m_sizeLabel = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"Size (single):"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_sizeLabel.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_sizeLabel, wx.GBPosition( 6, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + self.m_sizeXLabel = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"X:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_sizeXLabel.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_sizeXLabel, wx.GBPosition( 7, 0 ), wx.GBSpan( 1, 1 ), wx.ALIGN_RIGHT|wx.ALL, 5 ) + + self.m_sizeXCtrl = wx.TextCtrl( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 100,-1 ), wx.TE_READONLY ) + self.m_sizeXCtrl.SetMaxLength( 0 ) + m_fabBaseInfoSizer.Add( self.m_sizeXCtrl, wx.GBPosition( 7, 1 ), wx.GBSpan( 1, 1 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_sizeXUnit = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"mm"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_sizeXUnit.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_sizeXUnit, wx.GBPosition( 7, 2 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + self.m_sizeYLabel1 = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"Y:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_sizeYLabel1.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_sizeYLabel1, wx.GBPosition( 8, 0 ), wx.GBSpan( 1, 1 ), wx.ALIGN_RIGHT|wx.ALL, 5 ) + + self.m_sizeYCtrl = wx.TextCtrl( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 100,-1 ), wx.TE_READONLY ) + self.m_sizeYCtrl.SetMaxLength( 0 ) + m_fabBaseInfoSizer.Add( self.m_sizeYCtrl, wx.GBPosition( 8, 1 ), wx.GBSpan( 1, 1 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_sizeYUnit = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"mm"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_sizeYUnit.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_sizeYUnit, wx.GBPosition( 8, 2 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + self.m_quantityLbel = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"Qty(single):"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_quantityLbel.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_quantityLbel, wx.GBPosition( 9, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_quantityCtrlChoices = [ _(u"5"), _(u"10"), _(u"15"), _(u"20"), _(u"25"), _(u"30"), _(u"40"), _(u"50"), _(u"75"), _(u"100"), _(u"125"), _(u"150"), _(u"200"), _(u"250"), _(u"300"), _(u"350"), _(u"400"), _(u"450"), _(u"500"), _(u"600"), _(u"700"), _(u"800"), _(u"900"), _(u"1000"), _(u"1500"), _(u"2000"), _(u"2500"), _(u"3000"), _(u"3500"), _(u"4000"), _(u"4500"), _(u"5000"), _(u"5500"), _(u"6000"), _(u"6500"), _(u"7000"), _(u"7500"), _(u"8000"), _(u"9000"), _(u"10000") ] + self.m_quantityCtrl = wx.Choice( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_quantityCtrlChoices, 0 ) + self.m_quantityCtrl.SetSelection( 0 ) + m_fabBaseInfoSizer.Add( self.m_quantityCtrl, wx.GBPosition( 9, 1 ), wx.GBSpan( 1, 1 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_quantityUnit = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"Pcs"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_quantityUnit.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_quantityUnit, wx.GBPosition( 9, 2 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + self.m_marginLabel = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"Break-away Rail:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_marginLabel.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_marginLabel, wx.GBPosition( 10, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_marginModeCtrlChoices = [ _(u"N/A"), _(u"Left & Right"), _(u"Top & Bottom"), _(u"All 4 sides") ] + self.m_marginModeCtrl = wx.Choice( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_marginModeCtrlChoices, 0 ) + self.m_marginModeCtrl.SetSelection( 0 ) + m_fabBaseInfoSizer.Add( self.m_marginModeCtrl, wx.GBPosition( 10, 1 ), wx.GBSpan( 1, 1 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_marginValueCtrl = wx.TextCtrl( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 100,-1 ), wx.TE_READONLY ) + self.m_marginValueCtrl.SetMaxLength( 0 ) + m_fabBaseInfoSizer.Add( self.m_marginValueCtrl, wx.GBPosition( 11, 1 ), wx.GBSpan( 1, 1 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_marginValueUnit = wx.StaticText( m_fabBaseInfo.GetStaticBox(), wx.ID_ANY, _(u"mm"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_marginValueUnit.Wrap( -1 ) + + m_fabBaseInfoSizer.Add( self.m_marginValueUnit, wx.GBPosition( 11, 2 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + + m_fabBaseInfoSizer.AddGrowableCol( 1 ) + + m_fabBaseInfo.Add( m_fabBaseInfoSizer, 1, wx.EXPAND, 5 ) + + + m_panelFabSizer.Add( m_fabBaseInfo, 0, wx.ALL|wx.EXPAND, 5 ) + + m_fabProcessInfo = wx.StaticBoxSizer( wx.StaticBox( self.m_panelFab, wx.ID_ANY, _(u"Process info") ), wx.VERTICAL ) + + m_fabProcessInfoSizer = wx.GridBagSizer( 0, 0 ) + m_fabProcessInfoSizer.SetFlexibleDirection( wx.BOTH ) + m_fabProcessInfoSizer.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.m_boardThicknessLabel = wx.StaticText( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, _(u"PCB Thickness:"), wx.DefaultPosition, wx.Size( -1,-1 ), 0 ) + self.m_boardThicknessLabel.Wrap( -1 ) + + m_fabProcessInfoSizer.Add( self.m_boardThicknessLabel, wx.GBPosition( 0, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_boardThicknessCtrlChoices = [ _(u"0.6"), _(u"0.8"), _(u"1.0"), _(u"1.2"), _(u"1.6"), _(u"2.0"), _(u"2.5"), _(u"3.0"), _(u"3.2") ] + self.m_boardThicknessCtrl = wx.Choice( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_boardThicknessCtrlChoices, 0 ) + self.m_boardThicknessCtrl.SetSelection( 4 ) + m_fabProcessInfoSizer.Add( self.m_boardThicknessCtrl, wx.GBPosition( 0, 1 ), wx.GBSpan( 1, 1 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_boardThicknessUnit = wx.StaticText( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, _(u"mm"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_boardThicknessUnit.Wrap( -1 ) + + m_fabProcessInfoSizer.Add( self.m_boardThicknessUnit, wx.GBPosition( 0, 2 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + self.m_outerCopperThicknessLabel = wx.StaticText( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, _(u"Finished Copper Weight:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_outerCopperThicknessLabel.Wrap( -1 ) + + m_fabProcessInfoSizer.Add( self.m_outerCopperThicknessLabel, wx.GBPosition( 1, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_outerCopperThicknessCtrlChoices = [ _(u"1oz"), _(u"2oz") ] + self.m_outerCopperThicknessCtrl = wx.Choice( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_outerCopperThicknessCtrlChoices, 0 ) + self.m_outerCopperThicknessCtrl.SetSelection( 0 ) + m_fabProcessInfoSizer.Add( self.m_outerCopperThicknessCtrl, wx.GBPosition( 1, 1 ), wx.GBSpan( 1, 2 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_innerCopperThicknessLabel = wx.StaticText( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, _(u"Inner Copper Weight:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_innerCopperThicknessLabel.Wrap( -1 ) + + m_fabProcessInfoSizer.Add( self.m_innerCopperThicknessLabel, wx.GBPosition( 2, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_innerCopperThicknessCtrlChoices = [ _(u"0.5oz"), _(u"1oz"), _(u"2oz") ] + self.m_innerCopperThicknessCtrl = wx.Choice( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_innerCopperThicknessCtrlChoices, 0 ) + self.m_innerCopperThicknessCtrl.SetSelection( 0 ) + m_fabProcessInfoSizer.Add( self.m_innerCopperThicknessCtrl, wx.GBPosition( 2, 1 ), wx.GBSpan( 1, 2 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_minTraceWidthClearanceLabel = wx.StaticText( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, _(u"Min Trace/Space Outer:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_minTraceWidthClearanceLabel.Wrap( -1 ) + + m_fabProcessInfoSizer.Add( self.m_minTraceWidthClearanceLabel, wx.GBPosition( 3, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_minTraceWidthClearanceCtrlChoices = [ _(u"10/10mil"), _(u"8/8mil"), _(u"6/6mil"), _(u"5/5mil"), _(u"4/4mil"), _(u"3.5/3.5mil") ] + self.m_minTraceWidthClearanceCtrl = wx.Choice( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_minTraceWidthClearanceCtrlChoices, 0 ) + self.m_minTraceWidthClearanceCtrl.SetSelection( 2 ) + m_fabProcessInfoSizer.Add( self.m_minTraceWidthClearanceCtrl, wx.GBPosition( 3, 1 ), wx.GBSpan( 1, 2 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_minHoleSizeLabel = wx.StaticText( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, _(u"Min Drilled Hole:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_minHoleSizeLabel.Wrap( -1 ) + + m_fabProcessInfoSizer.Add( self.m_minHoleSizeLabel, wx.GBPosition( 4, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_minHoleSizeCtrlChoices = [ _(u"0.3mm"), _(u"0.25mm"), _(u"0.2mm"), _(u"0.15mm") ] + self.m_minHoleSizeCtrl = wx.Choice( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_minHoleSizeCtrlChoices, 0 ) + self.m_minHoleSizeCtrl.SetSelection( 0 ) + m_fabProcessInfoSizer.Add( self.m_minHoleSizeCtrl, wx.GBPosition( 4, 1 ), wx.GBSpan( 1, 2 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_solderColorLabel = wx.StaticText( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, _(u"Solder Mask Color:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_solderColorLabel.Wrap( -1 ) + + m_fabProcessInfoSizer.Add( self.m_solderColorLabel, wx.GBPosition( 5, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_solderColorCtrlChoices = [ _(u"Green"), _(u"Red"), _(u"Yellow"), _(u"Blue"), _(u"White"), _(u"Matte Black"), _(u"Black") ] + self.m_solderColorCtrl = wx.Choice( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_solderColorCtrlChoices, 0 ) + self.m_solderColorCtrl.SetSelection( 0 ) + m_fabProcessInfoSizer.Add( self.m_solderColorCtrl, wx.GBPosition( 5, 1 ), wx.GBSpan( 1, 2 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_silkscreenColorLabel = wx.StaticText( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, _(u"Silkscreen:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_silkscreenColorLabel.Wrap( -1 ) + + m_fabProcessInfoSizer.Add( self.m_silkscreenColorLabel, wx.GBPosition( 6, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_silkscreenColorCtrlChoices = [ _(u"White") ] + self.m_silkscreenColorCtrl = wx.Choice( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_silkscreenColorCtrlChoices, 0 ) + self.m_silkscreenColorCtrl.SetSelection( 0 ) + m_fabProcessInfoSizer.Add( self.m_silkscreenColorCtrl, wx.GBPosition( 6, 1 ), wx.GBSpan( 1, 2 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_solderCoverLabel = wx.StaticText( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, _(u"Via Process:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_solderCoverLabel.Wrap( -1 ) + + m_fabProcessInfoSizer.Add( self.m_solderCoverLabel, wx.GBPosition( 7, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_solderCoverCtrlChoices = [ _(u"Tenting Vias"), _(u"Vias not covered"), _(u"Solder Mask Plug (IV-B)"), _(u"Non-Conductive Fill") ] + self.m_solderCoverCtrl = wx.Choice( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_solderCoverCtrlChoices, 0 ) + self.m_solderCoverCtrl.SetSelection( 0 ) + m_fabProcessInfoSizer.Add( self.m_solderCoverCtrl, wx.GBPosition( 7, 1 ), wx.GBSpan( 1, 2 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_surfaceProcessLabel = wx.StaticText( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, _(u"Surface Finish:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_surfaceProcessLabel.Wrap( -1 ) + + m_fabProcessInfoSizer.Add( self.m_surfaceProcessLabel, wx.GBPosition( 8, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_surfaceProcessCtrlChoices = [ _(u"HASL"), _(u"Lead free HASL"), _(u"ENIG"), _(u"OSP") ] + self.m_surfaceProcessCtrl = wx.Choice( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_surfaceProcessCtrlChoices, 0 ) + self.m_surfaceProcessCtrl.SetSelection( 0 ) + m_fabProcessInfoSizer.Add( self.m_surfaceProcessCtrl, wx.GBPosition( 8, 1 ), wx.GBSpan( 1, 2 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_goldThicknessLabel = wx.StaticText( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, _(u"Immersion Gold Thickness:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_goldThicknessLabel.Wrap( -1 ) + + m_fabProcessInfoSizer.Add( self.m_goldThicknessLabel, wx.GBPosition( 9, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_goldThicknessCtrlChoices = [ _(u"1µm"), _(u"2µm"), _(u"3µm") ] + self.m_goldThicknessCtrl = wx.Choice( m_fabProcessInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_goldThicknessCtrlChoices, 0 ) + self.m_goldThicknessCtrl.SetSelection( 0 ) + m_fabProcessInfoSizer.Add( self.m_goldThicknessCtrl, wx.GBPosition( 9, 1 ), wx.GBSpan( 1, 2 ), wx.ALL|wx.EXPAND, 5 ) + + + m_fabProcessInfoSizer.AddGrowableCol( 1 ) + + m_fabProcessInfo.Add( m_fabProcessInfoSizer, 1, wx.EXPAND, 5 ) + + + m_panelFabSizer.Add( m_fabProcessInfo, 0, wx.ALL|wx.EXPAND, 5 ) + + m_fabSpecialProcess = wx.StaticBoxSizer( wx.StaticBox( self.m_panelFab, wx.ID_ANY, _(u"Special Process") ), wx.VERTICAL ) + + m_fabSpecialProcessSizer = wx.GridBagSizer( 0, 0 ) + m_fabSpecialProcessSizer.SetFlexibleDirection( wx.BOTH ) + m_fabSpecialProcessSizer.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.m_impedanceLabel = wx.StaticText( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, _(u"Impedance:"), wx.DefaultPosition, wx.Size( 100,-1 ), 0 ) + self.m_impedanceLabel.Wrap( -1 ) + + m_fabSpecialProcessSizer.Add( self.m_impedanceLabel, wx.GBPosition( 0, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_impedanceCtrlChoices = [ _(u"No"), _(u"Yes") ] + self.m_impedanceCtrl = wx.Choice( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_impedanceCtrlChoices, 0 ) + self.m_impedanceCtrl.SetSelection( 0 ) + m_fabSpecialProcessSizer.Add( self.m_impedanceCtrl, wx.GBPosition( 0, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_goldFingerLabel = wx.StaticText( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, _(u"Beveling of G/F:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_goldFingerLabel.Wrap( -1 ) + + m_fabSpecialProcessSizer.Add( self.m_goldFingerLabel, wx.GBPosition( 1, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_goldFingerCtrlChoices = [ _(u"No"), _(u"Yes") ] + self.m_goldFingerCtrl = wx.Choice( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_goldFingerCtrlChoices, 0 ) + self.m_goldFingerCtrl.SetSelection( 0 ) + m_fabSpecialProcessSizer.Add( self.m_goldFingerCtrl, wx.GBPosition( 1, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_halfHoleLabel = wx.StaticText( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, _(u"Plated Half Holes:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_halfHoleLabel.Wrap( -1 ) + + m_fabSpecialProcessSizer.Add( self.m_halfHoleLabel, wx.GBPosition( 2, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_halfHoleCtrlChoices = [ _(u"No"), _(u"Yes") ] + self.m_halfHoleCtrl = wx.Choice( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_halfHoleCtrlChoices, 0 ) + self.m_halfHoleCtrl.SetSelection( 0 ) + m_fabSpecialProcessSizer.Add( self.m_halfHoleCtrl, wx.GBPosition( 2, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_padHoleLabel = wx.StaticText( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, _(u"Pad Hole:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_padHoleLabel.Wrap( -1 ) + + m_fabSpecialProcessSizer.Add( self.m_padHoleLabel, wx.GBPosition( 3, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_padHoleCtrlChoices = [ _(u"No"), _(u"Yes") ] + self.m_padHoleCtrl = wx.Choice( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_padHoleCtrlChoices, 0 ) + self.m_padHoleCtrl.SetSelection( 0 ) + m_fabSpecialProcessSizer.Add( self.m_padHoleCtrl, wx.GBPosition( 3, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_blindViaLabel = wx.StaticText( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, _(u"HDI(Buried/blind vias):"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_blindViaLabel.Wrap( -1 ) + + m_fabSpecialProcessSizer.Add( self.m_blindViaLabel, wx.GBPosition( 4, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_blindViaCtrlChoices = [ _(u"No"), _(u"Yes") ] + self.m_blindViaCtrl = wx.Choice( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_blindViaCtrlChoices, 0 ) + self.m_blindViaCtrl.SetSelection( 0 ) + m_fabSpecialProcessSizer.Add( self.m_blindViaCtrl, wx.GBPosition( 4, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_hdiStructureLabel = wx.StaticText( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, _(u"HDI Structure:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_hdiStructureLabel.Wrap( -1 ) + + m_fabSpecialProcessSizer.Add( self.m_hdiStructureLabel, wx.GBPosition( 5, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_hdiStructureCtrlChoices = [ _(u"Rank 1"), _(u"Rank 2"), _(u"Rank 3") ] + self.m_hdiStructureCtrl = wx.Choice( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_hdiStructureCtrlChoices, 0 ) + self.m_hdiStructureCtrl.SetSelection( 0 ) + m_fabSpecialProcessSizer.Add( self.m_hdiStructureCtrl, wx.GBPosition( 5, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_stackupLabel = wx.StaticText( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, _(u"Stack up:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_stackupLabel.Wrap( -1 ) + + m_fabSpecialProcessSizer.Add( self.m_stackupLabel, wx.GBPosition( 6, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_stackupCtrlChoices = [ _(u"No Requirement"), _(u"Customer Specified Stack up") ] + self.m_stackupCtrl = wx.Choice( m_fabSpecialProcess.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_stackupCtrlChoices, 0 ) + self.m_stackupCtrl.SetSelection( 0 ) + m_fabSpecialProcessSizer.Add( self.m_stackupCtrl, wx.GBPosition( 6, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + + m_fabSpecialProcessSizer.AddGrowableCol( 1 ) + + m_fabSpecialProcess.Add( m_fabSpecialProcessSizer, 1, wx.EXPAND, 5 ) + + + m_panelFabSizer.Add( m_fabSpecialProcess, 0, wx.ALL|wx.EXPAND, 5 ) + + m_fabServiceInfo = wx.StaticBoxSizer( wx.StaticBox( self.m_panelFab, wx.ID_ANY, _(u"Personalized Service") ), wx.VERTICAL ) + + m_fabServiceInfoSizer = wx.GridBagSizer( 0, 0 ) + m_fabServiceInfoSizer.SetFlexibleDirection( wx.BOTH ) + m_fabServiceInfoSizer.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.m_testMethodLabel = wx.StaticText( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, _(u"Electrical Test:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_testMethodLabel.Wrap( -1 ) + + m_fabServiceInfoSizer.Add( self.m_testMethodLabel, wx.GBPosition( 0, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_testMethodCtrlChoices = [ _(u"Sample Test Free"), _(u"AOI+Flying Test"), _(u"AOI+Fixture") ] + self.m_testMethodCtrl = wx.Choice( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_testMethodCtrlChoices, 0 ) + self.m_testMethodCtrl.SetSelection( 0 ) + m_fabServiceInfoSizer.Add( self.m_testMethodCtrl, wx.GBPosition( 0, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_approveWorkingGerberLabel = wx.StaticText( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, _(u"Approve Working Gerber:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_approveWorkingGerberLabel.Wrap( -1 ) + + m_fabServiceInfoSizer.Add( self.m_approveWorkingGerberLabel, wx.GBPosition( 1, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_approveWorkingGerberCtrlChoices = [ _(u"No"), _(u"Yes") ] + self.m_approveWorkingGerberCtrl = wx.Choice( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_approveWorkingGerberCtrlChoices, 0 ) + self.m_approveWorkingGerberCtrl.SetSelection( 0 ) + m_fabServiceInfoSizer.Add( self.m_approveWorkingGerberCtrl, wx.GBPosition( 1, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_deliveryReportLabel = wx.StaticText( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, _(u"Delivery Report:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_deliveryReportLabel.Wrap( -1 ) + + m_fabServiceInfoSizer.Add( self.m_deliveryReportLabel, wx.GBPosition( 2, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_deliveryReportCtrlChoices = [ _(u"No"), _(u"Yes") ] + self.m_deliveryReportCtrl = wx.Choice( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_deliveryReportCtrlChoices, 0 ) + self.m_deliveryReportCtrl.SetSelection( 0 ) + m_fabServiceInfoSizer.Add( self.m_deliveryReportCtrl, wx.GBPosition( 2, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_analysisReportLabel = wx.StaticText( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, _(u"Microsection Analysis Report:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_analysisReportLabel.Wrap( -1 ) + + m_fabServiceInfoSizer.Add( self.m_analysisReportLabel, wx.GBPosition( 3, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_analysisReportCtrlChoices = [ _(u"No"), _(u"Yes") ] + self.m_analysisReportCtrl = wx.Choice( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_analysisReportCtrlChoices, 0 ) + self.m_analysisReportCtrl.SetSelection( 0 ) + m_fabServiceInfoSizer.Add( self.m_analysisReportCtrl, wx.GBPosition( 3, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_reportFormatLabel = wx.StaticText( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, _(u"Report Format:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_reportFormatLabel.Wrap( -1 ) + + m_fabServiceInfoSizer.Add( self.m_reportFormatLabel, wx.GBPosition( 4, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_reportFormatCtrlChoices = [ _(u"Paper"), _(u"Electronic") ] + self.m_reportFormatCtrl = wx.Choice( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_reportFormatCtrlChoices, 0 ) + self.m_reportFormatCtrl.SetSelection( 1 ) + m_fabServiceInfoSizer.Add( self.m_reportFormatCtrl, wx.GBPosition( 4, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_ulMarkLabel = wx.StaticText( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, _(u"UL Mark:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_ulMarkLabel.Wrap( -1 ) + + m_fabServiceInfoSizer.Add( self.m_ulMarkLabel, wx.GBPosition( 5, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_ulMarkCtrlChoices = [ _(u"No"), _(u"UL+Week/Year"), _(u"UL+Year/Week") ] + self.m_ulMarkCtrl = wx.Choice( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_ulMarkCtrlChoices, 0 ) + self.m_ulMarkCtrl.SetSelection( 0 ) + m_fabServiceInfoSizer.Add( self.m_ulMarkCtrl, wx.GBPosition( 5, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_filmLabel = wx.StaticText( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, _(u"Film:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_filmLabel.Wrap( -1 ) + + m_fabServiceInfoSizer.Add( self.m_filmLabel, wx.GBPosition( 6, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + m_filmCtrlChoices = [ _(u"No"), _(u"Yes") ] + self.m_filmCtrl = wx.Choice( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.Size( 100,-1 ), m_filmCtrlChoices, 0 ) + self.m_filmCtrl.SetSelection( 0 ) + m_fabServiceInfoSizer.Add( self.m_filmCtrl, wx.GBPosition( 6, 1 ), wx.GBSpan( 1, 3 ), wx.ALL|wx.EXPAND, 5 ) + + self.m_specialRequestsLabel = wx.StaticText( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, _(u"Special Requests:"), wx.DefaultPosition, wx.Size( -1,-1 ), 0 ) + self.m_specialRequestsLabel.Wrap( -1 ) + + m_fabServiceInfoSizer.Add( self.m_specialRequestsLabel, wx.GBPosition( 7, 0 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 ) + + self.m_specialRequestsCtrl = wx.TextCtrl( m_fabServiceInfo.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 100,-1 ), 0 ) + m_fabServiceInfoSizer.Add( self.m_specialRequestsCtrl, wx.GBPosition( 7, 1 ), wx.GBSpan( 5, 3 ), wx.ALL|wx.EXPAND, 5 ) + + + m_fabServiceInfoSizer.AddGrowableCol( 1 ) + + m_fabServiceInfo.Add( m_fabServiceInfoSizer, 1, wx.EXPAND, 5 ) + + + m_panelFabSizer.Add( m_fabServiceInfo, 0, wx.ALL|wx.EXPAND, 5 ) + + + self.m_panelFab.SetSizer( m_panelFabSizer ) + self.m_panelFab.Layout() + m_panelFabSizer.Fit( self.m_panelFab ) + self.m_notebook.AddPage( self.m_panelFab, _(u"PCB Fabrication"), False ) + + m_topLeftSizer.Add( self.m_notebook, 1, wx.ALIGN_CENTER|wx.EXPAND|wx.TOP, 12 ) + + + m_topSizer.Add( m_topLeftSizer, 6, wx.ALL|wx.EXPAND, 5 ) + + m_topRightSizer = wx.BoxSizer( wx.VERTICAL ) + + m_totalSummarySizer = wx.GridBagSizer( 0, 0 ) + m_totalSummarySizer.SetFlexibleDirection( wx.BOTH ) + m_totalSummarySizer.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED ) + + self.m_huaqiuLogo = wx.StaticBitmap( self, wx.ID_ANY, wx.Bitmap( self.GetImagePath( u"Huaqiu.png" ), wx.BITMAP_TYPE_ANY ), wx.DefaultPosition, wx.DefaultSize, 0 ) + m_totalSummarySizer.Add( self.m_huaqiuLogo, wx.GBPosition( 0, 0 ), wx.GBSpan( 3, 1 ), wx.ALL|wx.EXPAND|wx.RIGHT|wx.TOP, 5 ) + + self.m_amountLabel = wx.StaticText( self, wx.ID_ANY, _(u"PCB Qty:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_amountLabel.Wrap( -1 ) + + m_totalSummarySizer.Add( self.m_amountLabel, wx.GBPosition( 0, 1 ), wx.GBSpan( 1, 1 ), wx.LEFT|wx.TOP, 5 ) + + self.m_amountCtrl = wx.StaticText( self, wx.ID_ANY, _(u"-"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_amountCtrl.Wrap( -1 ) + + m_totalSummarySizer.Add( self.m_amountCtrl, wx.GBPosition( 0, 2 ), wx.GBSpan( 1, 1 ), wx.TOP, 5 ) + + self.m_amountUnit = wx.StaticText( self, wx.ID_ANY, _(u"pcs"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_amountUnit.Wrap( -1 ) + + m_totalSummarySizer.Add( self.m_amountUnit, wx.GBPosition( 0, 3 ), wx.GBSpan( 1, 1 ), wx.LEFT|wx.TOP, 5 ) + + self.m_dueDateLabel = wx.StaticText( self, wx.ID_ANY, _(u"Time:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_dueDateLabel.Wrap( -1 ) + + m_totalSummarySizer.Add( self.m_dueDateLabel, wx.GBPosition( 1, 1 ), wx.GBSpan( 1, 1 ), wx.LEFT, 5 ) + + self.m_dueDateCtrl = wx.StaticText( self, wx.ID_ANY, _(u"-"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_dueDateCtrl.Wrap( -1 ) + + m_totalSummarySizer.Add( self.m_dueDateCtrl, wx.GBPosition( 1, 2 ), wx.GBSpan( 1, 1 ), 0, 5 ) + + self.m_dueDateUnit = wx.StaticText( self, wx.ID_ANY, _(u"Days"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_dueDateUnit.Wrap( -1 ) + + m_totalSummarySizer.Add( self.m_dueDateUnit, wx.GBPosition( 1, 3 ), wx.GBSpan( 1, 1 ), wx.LEFT, 5 ) + + self.m_priceLabel = wx.StaticText( self, wx.ID_ANY, _(u"Cost:"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_priceLabel.Wrap( -1 ) + + m_totalSummarySizer.Add( self.m_priceLabel, wx.GBPosition( 2, 1 ), wx.GBSpan( 1, 1 ), wx.LEFT|wx.TOP, 5 ) + + self.m_priceCtrl = wx.StaticText( self, wx.ID_ANY, _(u"-"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_priceCtrl.Wrap( -1 ) + + m_totalSummarySizer.Add( self.m_priceCtrl, wx.GBPosition( 2, 2 ), wx.GBSpan( 1, 1 ), wx.TOP, 5 ) + + self.m_priceUnit = wx.StaticText( self, wx.ID_ANY, _(u"$"), wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_priceUnit.Wrap( -1 ) + + m_totalSummarySizer.Add( self.m_priceUnit, wx.GBPosition( 2, 3 ), wx.GBSpan( 1, 1 ), wx.LEFT|wx.TOP, 5 ) + + self.m_updatePriceButton = wx.Button( self, wx.ID_ANY, _(u"Update Price"), wx.DefaultPosition, wx.DefaultSize, 0 ) + m_totalSummarySizer.Add( self.m_updatePriceButton, wx.GBPosition( 2, 4 ), wx.GBSpan( 1, 1 ), wx.BOTTOM|wx.EXPAND|wx.RIGHT, 5 ) + + self.m_placeOrderButton = wx.Button( self, wx.ID_ANY, _(u"Place Order"), wx.DefaultPosition, wx.DefaultSize, 0 ) + m_totalSummarySizer.Add( self.m_placeOrderButton, wx.GBPosition( 0, 4 ), wx.GBSpan( 1, 1 ), wx.EXPAND|wx.RIGHT|wx.TOP, 5 ) + + + m_totalSummarySizer.AddGrowableCol( 2 ) + m_totalSummarySizer.AddGrowableCol( 3 ) + + m_topRightSizer.Add( m_totalSummarySizer, 0, wx.EXPAND, 5 ) + + self.m_priceDetailsViewListCtrl = wx.dataview.DataViewListCtrl( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0 ) + self.m_priceDescriptionColumn = self.m_priceDetailsViewListCtrl.AppendTextColumn( _(u"Item"), wx.dataview.DATAVIEW_CELL_INERT, 200, wx.ALIGN_LEFT, wx.dataview.DATAVIEW_COL_RESIZABLE ) + self.m_priceColumn = self.m_priceDetailsViewListCtrl.AppendTextColumn( _(u"Price"), wx.dataview.DATAVIEW_CELL_INERT, -1, wx.ALIGN_LEFT, wx.dataview.DATAVIEW_COL_RESIZABLE ) + m_topRightSizer.Add( self.m_priceDetailsViewListCtrl, 1, wx.ALL|wx.EXPAND, 5 ) + + self.m_drcPanel = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.BORDER_SIMPLE|wx.TAB_TRAVERSAL ) + m_drcPanelSizer = wx.BoxSizer( wx.VERTICAL ) + + + self.m_drcPanel.SetSizer( m_drcPanelSizer ) + self.m_drcPanel.Layout() + m_drcPanelSizer.Fit( self.m_drcPanel ) + m_topRightSizer.Add( self.m_drcPanel, 1, wx.ALL|wx.EXPAND, 5 ) + + + m_topSizer.Add( m_topRightSizer, 5, wx.ALL|wx.EXPAND, 5 ) + + + m_mainSizer.Add( m_topSizer, 1, wx.EXPAND, 8 ) + + + self.SetSizer( m_mainSizer ) + self.Layout() + + self.Centre( wx.BOTH ) + + # Connect Events + self.m_template.Bind( wx.EVT_CHOICE, self.OnTemplateChanged ) + self.m_pcbPackaingCtrl.Bind( wx.EVT_CHOICE, self.OnPcbPackagingChanged ) + self.m_panelizeXCtrl.Bind( wx.EVT_TEXT, self.OnPanelizeXChanged ) + self.m_panelizeYCtrl.Bind( wx.EVT_TEXT, self.OnPanelizeYChanged ) + self.m_quantityCtrl.Bind( wx.EVT_CHOICE, self.OnPcbQuantityChanged ) + self.m_marginModeCtrl.Bind( wx.EVT_CHOICE, self.OnMarginModeChanged ) + self.m_surfaceProcessCtrl.Bind( wx.EVT_CHOICE, self.OnSurfaceProcessChanged ) + self.m_blindViaCtrl.Bind( wx.EVT_CHOICE, self.OnHDIChanged ) + self.m_deliveryReportCtrl.Bind( wx.EVT_CHOICE, self.OnReportChanged ) + self.m_analysisReportCtrl.Bind( wx.EVT_CHOICE, self.OnReportChanged ) + self.m_updatePriceButton.Bind( wx.EVT_BUTTON, self.OnUpdatePrice ) + self.m_placeOrderButton.Bind( wx.EVT_BUTTON, self.OnPlaceOrder ) + self.m_solderColorCtrl.Bind( wx.EVT_CHOICE, self.OnMaskColorChange ) + #self.m_layerCountCtrl.Bind( wx.EVT_CHOICE, self.OnTGChangebyLayer ) + self.m_layerCountCtrl.Bind( wx.EVT_CHOICE, self.OnThicknessChangebyLayer ) + + + def __del__( self ): + pass + + + # Virtual event handlers, override them in your derived class + def OnTemplateChanged( self, event ): + event.Skip() + + def OnPcbPackagingChanged( self, event ): + event.Skip() + + def OnPanelizeXChanged( self, event ): + event.Skip() + + def OnPanelizeYChanged( self, event ): + event.Skip() + + def OnPcbQuantityChanged( self, event ): + event.Skip() + + def OnMarginModeChanged( self, event ): + event.Skip() + + def OnSurfaceProcessChanged( self, event ): + event.Skip() + + def OnHDIChanged( self, event ): + event.Skip() + + def OnReportChanged( self, event ): + event.Skip() + + + def OnUpdatePrice( self, event ): + event.Skip() + + def OnPlaceOrder( self, event ): + event.Skip() + + def OnMaskColorChange(self, event): + event.Skip() + + def OnThicknessChangebyLayer(self, event): + event.Skip() + + # Virtual image path resolution method. Override this in your derived class. + def GetImagePath( self, bitmap_path ): + return bitmap_path + + diff --git a/kicad_amf_plugin/kicad/fabrication_data_generator.py b/fabrication.py similarity index 67% rename from kicad_amf_plugin/kicad/fabrication_data_generator.py rename to fabrication.py index 78d8f8f..f1ad5cf 100644 --- a/kicad_amf_plugin/kicad/fabrication_data_generator.py +++ b/fabrication.py @@ -4,8 +4,6 @@ import re from pathlib import Path from zipfile import ZipFile -import contextlib -import shutil from pcbnew import ( EXCELLON_WRITER, @@ -36,34 +34,25 @@ from .helpers import get_exclude_from_pos, get_footprint_by_ref, get_smd, is_nightly -class FabricationDataGenerator: - def __init__(self, board): +class Fabrication: + def __init__(self, parent): self.logger = logging.getLogger(__name__) - self.board = board + self.parent = parent + self.board = GetBoard() self.corrections = [] self.path, self.filename = os.path.split(self.board.GetFileName()) - - @property - def nextpcb_root(self): - return os.path.join(self.path, "nextpcb_amf") - - @property - def output_dir(self): - return os.path.join(self.nextpcb_root, "output_files") - - def __del__(self): - if os.path.exists(self.output_dir): - os.remove(self.output_dir) + self.create_folders() def create_folders(self): """Create output folders if they not already exist.""" - Path(self.output_dir).mkdir(parents=True, exist_ok=True) + self.outputdir = os.path.join(self.path, "nextpcb_amf", "output_files") + Path(self.outputdir).mkdir(parents=True, exist_ok=True) self.gerberdir = os.path.join(self.path, "nextpcb_amf", "gerber") Path(self.gerberdir).mkdir(parents=True, exist_ok=True) def fill_zones(self): """Refill copper zones following user prompt.""" - # if self.parent.settings.get("gerber", {}).get("fill_zones", True): + #if self.parent.settings.get("gerber", {}).get("fill_zones", True): filler = ZONE_FILLER(self.board) zones = self.board.Zones() filler.Fill(zones) @@ -133,39 +122,60 @@ def generate_geber(self, layer_count=None): if not layer_count: layer_count = self.board.GetCopperLayerCount() - plot_plan_top = [ - ("CuTop", F_Cu, "Top layer"), - ("SilkTop", F_SilkS, "Silk top"), - ("MaskTop", F_Mask, "Mask top"), - ("PasteTop", F_Paste, "Paste top"), - ] - plot_plan_bottom = [ - ("CuBottom", B_Cu, "Bottom layer"), - ("SilkBottom", B_SilkS, "Silk top"), - ("MaskBottom", B_Mask, "Mask bottom"), - ("PasteBottom", B_Paste, "Paste bottom"), - ("EdgeCuts", Edge_Cuts, "Edges"), - ("VScore", Cmts_User, "V score cut"), - ] - - plot_plan = [] - - # Single sided PCB if layer_count == 1: - plot_plan = plot_plan_top + plot_plan_bottom[-2:] - # Double sided PCB + plot_plan = [ + ("CuTop", F_Cu, "Top layer"), + ("SilkTop", F_SilkS, "Silk top"), + ("MaskTop", F_Mask, "Mask top"), + ("PasteTop", F_Paste, "Paste top"), + ("EdgeCuts", Edge_Cuts, "Edges"), + ("VScore", Cmts_User, "V score cut"), + ] elif layer_count == 2: - plot_plan = plot_plan_top + plot_plan_bottom - # Everything with inner layers - else: - plot_plan = ( - plot_plan_top - + [ - (f"CuIn{layer}", layer, f"Inner layer {layer}") - for layer in range(1, layer_count - 1) - ] - + plot_plan_bottom - ) + plot_plan = [ + ("CuTop", F_Cu, "Top layer"), + ("SilkTop", F_SilkS, "Silk top"), + ("MaskTop", F_Mask, "Mask top"), + ("PasteTop", F_Paste, "Paste top"), + ("CuBottom", B_Cu, "Bottom layer"), + ("SilkBottom", B_SilkS, "Silk top"), + ("MaskBottom", B_Mask, "Mask bottom"), + ("PasteBottom", B_Paste, "Paste bottom"), + ("EdgeCuts", Edge_Cuts, "Edges"), + ("VScore", Cmts_User, "V score cut"), + ] + elif layer_count == 4: + plot_plan = [ + ("CuTop", F_Cu, "Top layer"), + ("SilkTop", F_SilkS, "Silk top"), + ("MaskTop", F_Mask, "Mask top"), + ("PasteTop", F_Paste, "Paste top"), + ("CuIn1", In1_Cu, "Inner layer 1"), + ("CuIn2", In2_Cu, "Inner layer 2"), + ("CuBottom", B_Cu, "Bottom layer"), + ("SilkBottom", B_SilkS, "Silk top"), + ("MaskBottom", B_Mask, "Mask bottom"), + ("PasteBottom", B_Paste, "Paste bottom"), + ("EdgeCuts", Edge_Cuts, "Edges"), + ("VScore", Cmts_User, "V score cut"), + ] + elif layer_count == 6: + plot_plan = [ + ("CuTop", F_Cu, "Top layer"), + ("SilkTop", F_SilkS, "Silk top"), + ("MaskTop", F_Mask, "Mask top"), + ("PasteTop", F_Paste, "Paste top"), + ("CuIn1", In1_Cu, "Inner layer 1"), + ("CuIn2", In2_Cu, "Inner layer 2"), + ("CuIn3", In3_Cu, "Inner layer 3"), + ("CuIn4", In4_Cu, "Inner layer 4"), + ("CuBottom", B_Cu, "Bottom layer"), + ("SilkBottom", B_SilkS, "Silk top"), + ("MaskBottom", B_Mask, "Mask bottom"), + ("PasteBottom", B_Paste, "Paste bottom"), + ("EdgeCuts", Edge_Cuts, "Edges"), + ("VScore", Cmts_User, "V score cut"), + ] for layer_info in plot_plan: if layer_info[1] <= B_Cu: @@ -195,7 +205,8 @@ def generate_excellon(self): def zip_gerber_excellon(self): """Zip Gerber and Excellon files, ready for upload.""" - with ZipFile(self.zip_file_path, "w") as zipfile: + zipname = f"GERBER-{self.filename.split('.')[0]}.zip" + with ZipFile(os.path.join(self.outputdir, zipname), "w") as zipfile: for folderName, subfolders, filenames in os.walk(self.gerberdir): for filename in filenames: if not filename.endswith(("gbr", "drl", "pdf")): @@ -207,10 +218,10 @@ def zip_gerber_excellon(self): def generate_cpl(self): """Generate placement file (CPL).""" cplname = f"CPL-{self.filename.split('.')[0]}.csv" - # self.corrections = self.parent.library.get_all_correction_data() + #self.corrections = self.parent.library.get_all_correction_data() aux_orgin = self.board.GetDesignSettings().GetAuxOrigin() with open( - os.path.join(self.output_dir, cplname), "w", newline="", encoding="utf-8" + os.path.join(self.outputdir, cplname), "w", newline="", encoding="utf-8" ) as csvfile: writer = csv.writer(csvfile, delimiter=",") writer.writerow( @@ -228,7 +239,7 @@ def generate_cpl(self): part[2], ToMM(position.x), ToMM(position.y) * -1, - "", + '', "top" if fp.GetLayer() == 0 else "bottom", ] ) @@ -238,28 +249,10 @@ def generate_bom(self): """Generate BOM file.""" bomname = f"BOM-{self.filename.split('.')[0]}.csv" with open( - os.path.join(self.output_dir, bomname), "w", newline="", encoding="utf-8" + os.path.join(self.outputdir, bomname), "w", newline="", encoding="utf-8" ) as csvfile: writer = csv.writer(csvfile, delimiter=",") writer.writerow(["Value", "Designator", "Footprint", "MPN"]) for part in self.parent.store.read_bom_parts(): writer.writerow(part) self.logger.info("Finished generating BOM file") - - @property - def zip_file_path(self): - return os.path.join( - self.output_dir, f"GERBER-{self.filename.split('.')[0]}.zip" - ) - - @contextlib.contextmanager - def create_kicad_pcb_file(self): - try: - self.create_folders() - self.fill_zones() - self.generate_geber(None) - self.generate_excellon() - self.zip_gerber_excellon() - yield self.zip_file_path - except Exception as error: - logging.error(f"Error while processing kicad pcb file ,detail : {error}") diff --git a/kicad_amf_plugin/kicad/helpers.py b/helpers.py similarity index 100% rename from kicad_amf_plugin/kicad/helpers.py rename to helpers.py diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..4d869d1 Binary files /dev/null and b/icon.png differ diff --git a/kicad_amf_plugin/__init__.py b/kicad_amf_plugin/__init__.py deleted file mode 100644 index 0dc000f..0000000 --- a/kicad_amf_plugin/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -import os - -PLUGIN_ROOT = os.path.dirname(os.path.abspath(__file__)) diff --git a/kicad_amf_plugin/api/base_request.py b/kicad_amf_plugin/api/base_request.py deleted file mode 100644 index dcc884d..0000000 --- a/kicad_amf_plugin/api/base_request.py +++ /dev/null @@ -1,9 +0,0 @@ -import dataclasses - - -@dataclasses.dataclass -class BaseRequest: - service: str = "pcb" - region_id: str = "211" # TODO - country: str = "211" # TODO - express: str = "31" # TODO diff --git a/kicad_amf_plugin/gui/__init__.py b/kicad_amf_plugin/gui/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/gui/app_base.py b/kicad_amf_plugin/gui/app_base.py deleted file mode 100644 index 8a0ae46..0000000 --- a/kicad_amf_plugin/gui/app_base.py +++ /dev/null @@ -1,89 +0,0 @@ -from wx.lib.mixins.inspection import InspectionMixin -from kicad_amf_plugin.language.lang_const import get_supported_language -from kicad_amf_plugin.language.lang_const import LANG_DOMAIN -from kicad_amf_plugin.settings.supported_layer_count import AVAILABLE_LAYER_COUNTS -import builtins -import sys -import os -from kicad_amf_plugin import PLUGIN_ROOT -from kicad_amf_plugin.gui.event.pcb_fabrication_evt_list import EVT_LOCALE_CHANGE -from kicad_amf_plugin.kicad.board_manager import load_board_manager -from kicad_amf_plugin.utils.combo_box_ignore_wheel import ComboBoxIgnoreWheel -import wx - -# add translation macro to builtin similar to what gettext does -builtins.__dict__["_"] = wx.GetTranslation -wx.Choice = ComboBoxIgnoreWheel - - -def _displayHook(obj): - if obj is not None: - print(repr(obj)) - - -class BaseApp(wx.App, InspectionMixin): - def __init__( - self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True - ): - super().__init__(redirect, filename, useBestVisual, clearSigInt) - self.Bind(EVT_LOCALE_CHANGE, self.on_locale_changed) - - def OnInit(self): - self.Init() # InspectionMixin - # work around for Python stealing "_" - sys.displayhook = _displayHook - self.locale = None - wx.Locale.AddCatalogLookupPathPrefix( - os.path.join(PLUGIN_ROOT, "language", "locale") - ) - from kicad_amf_plugin.settings.setting_manager import SETTING_MANAGER - - self.update_language(SETTING_MANAGER.language) - SETTING_MANAGER.register_app(self) - self.board_manager = load_board_manager() - if self.board_manager.board.GetCopperLayerCount() not in AVAILABLE_LAYER_COUNTS: - wx.MessageBox(_("Unsupported layer count!")) - return False - self.startup_dialog() - return True - - def on_locale_changed(self, evt): - self.update_language(evt.GetInt()) - info = wx.MessageDialog( - self.main_wind, - _( - "Restart the plugin to apply the new locale ?\nFor full translation(including the options), restarting KiCad is required" - ), - _("Tip"), - wx.YES | wx.ICON_QUESTION | wx.NO, - ) - res = info.ShowModal() - info.Destroy() - if res == wx.ID_YES: - if self.main_wind: - self.main_wind.Destroy() - self.startup_dialog() - - def update_language(self, lang: int): - if lang in get_supported_language(): - selLang = lang - else: - selLang = wx.LANGUAGE_ENGLISH - if self.locale: - assert sys.getrefcount(self.locale) <= 2 - del self.locale - - self.locale = wx.Locale(selLang) - if self.locale.IsOk(): - self.locale.AddCatalog(LANG_DOMAIN) - else: - self.locale = None - - def startup_dialog(self): - from kicad_amf_plugin.gui.main_frame import MainFrame - from kicad_amf_plugin.settings.setting_manager import SETTING_MANAGER - - self.main_wind = MainFrame( - self.board_manager, SETTING_MANAGER.get_window_size() - ) - self.main_wind.Show() diff --git a/kicad_amf_plugin/gui/event/__init__.py b/kicad_amf_plugin/gui/event/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/gui/event/pcb_fabrication_evt_list.py b/kicad_amf_plugin/gui/event/pcb_fabrication_evt_list.py deleted file mode 100644 index 8be6f42..0000000 --- a/kicad_amf_plugin/gui/event/pcb_fabrication_evt_list.py +++ /dev/null @@ -1,23 +0,0 @@ -import wx.lib.newevent as ne - -LocaleChangeEvent, EVT_LOCALE_CHANGE = ne.NewCommandEvent() - -PackageChangeEvt, EVT_PACKAGE_CHANGE = ne.NewCommandEvent() - -MarginModeChangedEvt, EVT_MARGIN_MODE_CHANGE = ne.NewCommandEvent() - -SurfaceProcessChanged, EVT_SURFACE_PROCESS_CHANGE = ne.NewCommandEvent() - -HDIChanged, EVT_HDI_CHANGE = ne.NewCommandEvent() - -ReportChanged, EVT_REPORT_CHANGE = ne.NewCommandEvent() - -UpdatePrice, EVT_UPDATE_PRICE = ne.NewCommandEvent() - -PlaceOrder, EVT_PLACE_ORDER = ne.NewCommandEvent() - -MaskColorChange, EVT_MASK_COLOR_CHANGE = ne.NewCommandEvent() - -LayerCountChange, EVT_LAYER_COUNT_CHANGE = ne.NewCommandEvent() - -OrderRegionChanged, EVT_ORDER_REGION_CHANGED = ne.NewCommandEvent() diff --git a/kicad_amf_plugin/gui/main_frame.py b/kicad_amf_plugin/gui/main_frame.py deleted file mode 100644 index 82e5b25..0000000 --- a/kicad_amf_plugin/gui/main_frame.py +++ /dev/null @@ -1,288 +0,0 @@ -from kicad_amf_plugin.gui.summary.price_summary_model import PriceCategory -from kicad_amf_plugin.kicad.board_manager import BoardManager -from kicad_amf_plugin.order.supported_region import SupportedRegion -from kicad_amf_plugin.pcb_fabrication.base.base_info_view import BaseInfoView -from kicad_amf_plugin.pcb_fabrication.process.process_info_view import ProcessInfoView -from kicad_amf_plugin.pcb_fabrication.special_process.special_process_view import ( - SpecialProcessView, -) -from kicad_amf_plugin.pcb_fabrication.personalized.personalized_info_view import ( - PersonalizedInfoView, -) -from kicad_amf_plugin.gui.summary.summary_panel import SummaryPanel -from kicad_amf_plugin.settings.default_express import DEFAULT_EXPRESS -from kicad_amf_plugin.settings.single_plugin import SINGLE_PLUGIN -from kicad_amf_plugin.utils.form_panel_base import FormKind, FormPanelBase -from kicad_amf_plugin.gui.event.pcb_fabrication_evt_list import ( - EVT_LAYER_COUNT_CHANGE, - EVT_UPDATE_PRICE, - EVT_PLACE_ORDER, - EVT_ORDER_REGION_CHANGED, -) -from kicad_amf_plugin.settings.setting_manager import SETTING_MANAGER -from kicad_amf_plugin.kicad.fabrication_data_generator import FabricationDataGenerator -from kicad_amf_plugin.api.base_request import BaseRequest -from kicad_amf_plugin.utils.request_helper import RequestHelper -from kicad_amf_plugin.gui.summary.order_summary_model import ( - AVAILABLE_TIME_UNIT, - OrderSummary, - BuildTime, - TimeUnit, -) -import wx -import wx.xrc -import wx.dataview -import urllib -import requests -import webbrowser -import json -from kicad_amf_plugin.order.order_region import OrderRegion, URL_KIND -from enum import Enum - - -class PCBFormPart(Enum): - BASE_INFO = 0 - PROCESS_INFO = 1 - SPECIAL_PROCESS = 2 - PERSONALIZED = 3 - - -PCB_PANEL_CTORS = { - PCBFormPart.BASE_INFO: BaseInfoView, - PCBFormPart.PROCESS_INFO: ProcessInfoView, - PCBFormPart.SPECIAL_PROCESS: SpecialProcessView, - PCBFormPart.PERSONALIZED: PersonalizedInfoView, -} - -DATA = "data" -LIST = "list" -SUGGEST = "suggest" -DEL_TIME = "deltime" -NAME = "name" -PCS_COUNT = "pcs_count" -TOTAL = "total" -PCB = "pcb" -FEE = "fee" -BCOUNT = "bcount" - - -class MainFrame(wx.Frame): - def __init__(self, board_manager: BoardManager, size, parent=None): - wx.Frame.__init__( - self, - parent, - id=wx.ID_ANY, - title=_("HQ NextPCB Active Manufacturing"), - pos=wx.DefaultPosition, - size=size, - style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, - ) - self._board_manager = board_manager - self._fabrication_data_gen = None - self._pcb_form_parts: "dict[PCBFormPart, FormPanelBase]" = {} - SINGLE_PLUGIN.register_main_wind(self) - self.init_ui() - - def init_ui(self): - wx.SizerFlags.DisableConsistencyChecks() - self.SetSizeHints(wx.DefaultSize, wx.DefaultSize) - main_sizer = wx.BoxSizer(wx.HORIZONTAL) - - pcb_fab_scroll_wind = wx.ScrolledWindow( - self, - wx.ID_ANY, - wx.DefaultPosition, - wx.Size(-1, -1), - wx.HSCROLL | wx.VSCROLL, - ) - pcb_fab_scroll_wind.SetScrollRate(10, 10) - - lay_pcb_fab_panel = wx.BoxSizer(wx.VERTICAL) - for i in PCB_PANEL_CTORS: - view = PCB_PANEL_CTORS[i](pcb_fab_scroll_wind, self._board_manager) - self._pcb_form_parts[i] = view - lay_pcb_fab_panel.Add(view, 0, wx.ALL | wx.EXPAND, 5) - pcb_fab_scroll_wind.SetSizer(lay_pcb_fab_panel) - pcb_fab_scroll_wind.Layout() - - self.summary_view = SummaryPanel(self) - main_sizer.Add(pcb_fab_scroll_wind, 1, wx.EXPAND, 8) - main_sizer.Add(self.summary_view, 0, wx.EXPAND, 8) - - self.Bind( - EVT_LAYER_COUNT_CHANGE, - self._pcb_form_parts[PCBFormPart.PROCESS_INFO].setup_board_thickness_choice, - ) - self.Bind( - EVT_LAYER_COUNT_CHANGE, - self._pcb_form_parts[PCBFormPart.SPECIAL_PROCESS].on_layer_count_changed, - ) - self.Bind(EVT_UPDATE_PRICE, self.on_update_price) - self.Bind(EVT_PLACE_ORDER, self.on_place_order) - self.Bind(EVT_ORDER_REGION_CHANGED, self.on_order_region_changed) - self.Bind(wx.EVT_SIZE, self.OnSize, self) - self.Bind(wx.EVT_CLOSE, self.OnClose, self) - - for i in self._pcb_form_parts.values(): - i.init() - i.on_region_changed() - - self.SetSizer(main_sizer) - self.Layout() - self.Centre(wx.BOTH) - - @property - def fabrication_data_generator(self): - if self._fabrication_data_gen is None: - self._fabrication_data_gen = FabricationDataGenerator( - self._board_manager.board - ) - return self._fabrication_data_gen - - def build_form(self, kind: FormKind): - base = BaseRequest().__dict__ - for i in self._pcb_form_parts.values(): - base = base | i.get_from(kind) - return base - - def get_query_price_form(self): - form = self.build_form(FormKind.QUERY_PRICE) - if SETTING_MANAGER.order_region == SupportedRegion.CHINA_MAINLAND: - form = form | DEFAULT_EXPRESS - return form - - def get_place_order_form(self): - return {**self.build_form(FormKind.PLACE_ORDER), "type": "pcbfile"} - - def form_is_valid(self): - for i in self._pcb_form_parts.values(): - if not i.is_valid(): - return False - return True - - def parse_zh_data_time(self, dt: str): - t = "" - unit = None - for i in dt: - if i.isnumeric(): - t = t + i - elif "天" == i: - unit = TimeUnit.DAY.value - if unit is None: - unit = TimeUnit.HOUR.value - return BuildTime(int(t), unit) - - def parse_price(self, summary: json): - self.summary_view.update_price_detail({PriceCategory.PCB.value: summary}) - normal_total_price = self.summary_view.get_total_price() - suggests = [] - if SUGGEST in summary and DEL_TIME in summary[SUGGEST]: - for suggest in summary[SUGGEST][DEL_TIME]: - if NAME in suggest and FEE in suggest and BCOUNT in suggest: - qty = int(suggest[BCOUNT]) - price = float(suggest[FEE]) + normal_total_price - suggests.append( - OrderSummary( - pcb_quantity=qty, - price=price, - build_time=self.parse_zh_data_time(suggest[NAME]), - ) - ) - self.summary_view.update_order_summary(suggests) - - def parse_price_list(self, summary: json): - self.summary_view.update_price_detail(summary) - suggests = [] - for item in summary: - if SUGGEST in summary[item] and DEL_TIME in summary[item][SUGGEST]: - for suggest in summary[item][SUGGEST][DEL_TIME]: - if NAME in suggest and TOTAL in suggest and PCS_COUNT in suggest: - full_time_cost = str(suggest[NAME]).split(" ") - if len(full_time_cost) > 1: - qty = int(suggest[PCS_COUNT]) - price = float(suggest[TOTAL]) - suggests.append( - OrderSummary( - pcb_quantity=qty, - price=price, - build_time=BuildTime( - int(full_time_cost[0]), full_time_cost[1] - ), - ) - ) - self.summary_view.update_order_summary(suggests) - - def on_update_price(self, evt): - if not self.form_is_valid(): - return - url = OrderRegion.get_url(SETTING_MANAGER.order_region, URL_KIND.QUERY_PRICE) - if url is None: - wx.MessageBox(_("No available url for querying price in current region")) - return - try: - form = self.get_query_price_form() - rep = urllib.request.Request( - url, data=RequestHelper.convert_dict_to_request_data(form) - ) - fp = urllib.request.urlopen(rep) - data = fp.read() - encoding = fp.info().get_content_charset("utf-8") - content = data.decode(encoding) - quote = json.loads(content) - if DATA in quote and LIST in quote[DATA]: - return self.parse_price_list(quote[DATA][LIST]) - elif SUGGEST in quote: - return self.parse_price(quote) - else: - err_msg = quote - if "msg" in quote: - err_msg = quote["msg"] - wx.MessageBox(_("Incorrect form parameter: ") + err_msg) - except Exception as e: - wx.MessageBox(str(e)) - raise e # TODO remove me - - def on_place_order(self, evt): - if not self.form_is_valid(): - return - try: - url = OrderRegion.get_url( - SETTING_MANAGER.order_region, URL_KIND.PLACE_ORDER - ) - if url is None: - wx.MessageBox(_("No available url for placing order in current region")) - return - with self.fabrication_data_generator.create_kicad_pcb_file() as zipfile: - rsp = requests.post( - url, - files={"file": open(zipfile, "rb")}, - data=self.get_place_order_form(), - ) - urls = json.loads(rsp.content) - for key in "url", "redirect": - if key in urls: - uat_url = str(urls[key]) - webbrowser.open(uat_url) - return - raise Exception("No available order url in the response") - except Exception as e: - wx.MessageBox(str(e)) - raise e # TODO remove me - - def adjust_size(self): - for i in self._pcb_form_parts.values(): - i.Layout() - self.Layout() - - def on_order_region_changed(self, ev): - for i in self._pcb_form_parts.values(): - i.on_region_changed() - self.adjust_size() - - def OnSize(self, evt): - evt.Skip() - SETTING_MANAGER.set_window_size(self.Size) - - def OnClose(self, evt): - SINGLE_PLUGIN.register_main_wind(None) - self.Destroy() diff --git a/kicad_amf_plugin/gui/summary/__init__.py b/kicad_amf_plugin/gui/summary/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/gui/summary/bom_price_model.py b/kicad_amf_plugin/gui/summary/bom_price_model.py deleted file mode 100644 index e1342a4..0000000 --- a/kicad_amf_plugin/gui/summary/bom_price_model.py +++ /dev/null @@ -1,20 +0,0 @@ -from .price_model_base import PriceModelBase, PriceItem - - -class BomPriceModel(PriceModelBase): - bom_price: float = 0 - - def data(self, row: int, col: int): - return 0 - - def name(self): - return _("BOM") - - def sum(self): - return 0 - - def get_items(self) -> "list[PriceItem]": - return [] - - def update(self, data: dict): - pass diff --git a/kicad_amf_plugin/gui/summary/order_summary_model.py b/kicad_amf_plugin/gui/summary/order_summary_model.py deleted file mode 100644 index 473d516..0000000 --- a/kicad_amf_plugin/gui/summary/order_summary_model.py +++ /dev/null @@ -1,85 +0,0 @@ -from dataclasses import dataclass -import wx.dataview as dv -from kicad_amf_plugin.settings.setting_manager import SETTING_MANAGER -from enum import Enum - -from collections import namedtuple - - -class TimeUnit(Enum): - DAY = "days" - HOUR = "hours" - - -AVAILABLE_TIME_UNIT = {TimeUnit.DAY.value: _("days"), TimeUnit.HOUR.value: _("hours")} - -BuildTime = namedtuple("BuildTime", ["Time", "Unit"]) - - -class OrderSummaryCol: - BUILD_TIME = 0 - QUANTITY = BUILD_TIME + 1 - PRICE = QUANTITY + 1 - - COL_COUNT = PRICE + 1 - - -@dataclass -class OrderSummary: - pcb_quantity: int - build_time: BuildTime - price: float - - -class OrderSummaryModel(dv.DataViewIndexListModel): - def __init__(self): - dv.DataViewIndexListModel.__init__(self) - self.orders_summary: "list[OrderSummary]" = [] - - # This method is called to provide the data object for a - # particular row,col - def GetValueByRow(self, row: int, col: int): - order = self.orders_summary[row] - map = { - 0: SETTING_MANAGER.get_build_time_formatter().format( - time=order.build_time.Time, unit=_(order.build_time.Unit) - ), - 1: str(order.pcb_quantity), - 2: f"{SETTING_MANAGER.get_price_unit()}{order.price}", - } - return map[col] - - # Report how many columns this model provides data for. - def GetColumnCount(self): - return OrderSummaryCol.COL_COUNT - - # Specify the data type for a column - def GetColumnType(self, col): - return "string" - - def SetValueByRow(self, value, row, col): - return False - - # Report the number of rows in the model - def GetCount(self): - # self.log.write('GetCount') - return len(self.orders_summary) - - # Called to check if non-standard attributes should be used in the - # cell at (row, col) - def GetAttrByRow(self, row, col, attr): - # self.log.write('GetAttrByRow: (%d, %d)' % (row, col)) - # if col == 3: - # attr.SetColour('red') - # attr.SetBold(True) - # return True - return False - - def update_order_info(self, data: "list[OrderSummary]"): - self.orders_summary = data - self.Reset(len(data)) - - def clear_content(self): - self.orders_summary = [] - self.Reset(len(self.orders_summary)) - self.Cleared() diff --git a/kicad_amf_plugin/gui/summary/pcb_price_model.py b/kicad_amf_plugin/gui/summary/pcb_price_model.py deleted file mode 100644 index 0a38a19..0000000 --- a/kicad_amf_plugin/gui/summary/pcb_price_model.py +++ /dev/null @@ -1,120 +0,0 @@ -from dataclasses import dataclass - -from .price_model_base import PriceModelBase, PriceModelCol, PriceItem -from kicad_amf_plugin.utils.number_round import number_round - -TRANSLATED = { - 0: _("testfee"), - 1: _("plate"), - 2: _("clc"), - 3: _("gch"), - 4: _("bgafee"), - 5: _("impendancefee"), - 6: _("pin"), - 7: _("copperfee"), - 8: _("colorfee"), - 9: _("sprayfee"), - 10: _("extraurgentfee"), - 11: _("viasfee"), - 12: _("bankongfee"), - 13: _("utilizationfee"), - 14: _("discountfee"), - 15: _("boardfee"), - 16: _("difficultyfee"), - 17: _("coverfee"), - 18: _("blindfee"), - 19: _("pressingfee"), - 20: _("cjfee"), - 21: _("pthfee"), - 22: _("viainpadfee"), - 23: _("reportfee"), - 24: _("populerfee"), - 25: _("paperfee"), - 26: _("userstampfee"), - 27: _("acceptancefee"), - 28: _("crossfee"), - 29: _("invoicefee"), - 30: _("insurancefee"), - 31: _("zkfee"), - 32: _("cutfee"), - 33: _("luocao"), - 34: _("luocheng"), -} - - -PROS = { - 0: "testfee", - 1: "plate", - 2: "clc", - 3: "gch", - 4: "bgafee", - 5: "impendancefee", - 6: "pin", - 7: "copperfee", - 8: "colorfee", - 9: "sprayfee", - 10: "extraurgentfee", - 11: "viasfee", - 12: "bankongfee", - 13: "utilizationfee", - 14: "discountfee", - 15: "boardfee", - 16: "difficultyfee", - 17: "coverfee", - 18: "blindfee", - 19: "pressingfee", - 20: "cjfee", - 21: "pthfee", - 22: "viainpadfee", - 23: "reportfee", - 24: "populerfee", - 25: "paperfee", - 26: "userstampfee", - 27: "acceptancefee", - 28: "crossfee", - 29: "invoicefee", - 30: "insurancefee", - 31: "zkfee", - 32: "cutfee", - 33: "luocao", - 34: "luocheng", -} - - -class PCBPriceModel(PriceModelBase): - def __init__(self) -> None: - super().__init__() - self.prices_item: "list[PriceItem]" = [] - for i in TRANSLATED: - self.prices_item.append(PriceItem(PROS[i], TRANSLATED[i], 0, self)) - - def data(self, row: int, col: int): - if col == PriceModelCol.VALUE: - return self.prices_item[row] - elif col == PriceModelCol.DESC: - return TRANSLATED[row] - - def name(self): - return "PCB" - - @number_round() - def sum(self): - num = 0 - for i in self.prices_item: - num = num + i.value - return num - - def get_items(self) -> "list[PriceItem]": - return [i for i in self.prices_item if i.value] - - def update(self, data: dict): - for i in PROS: - if PROS[i] in data: - self.prices_item[i].value = data[PROS[i]] - - def item_names(self): - return PROS - - def clear(self): - for i in self.prices_item: - i.value = 0 diff --git a/kicad_amf_plugin/gui/summary/place_order_request.py b/kicad_amf_plugin/gui/summary/place_order_request.py deleted file mode 100644 index b117fc4..0000000 --- a/kicad_amf_plugin/gui/summary/place_order_request.py +++ /dev/null @@ -1,8 +0,0 @@ -from dataclasses import dataclass - - -@dataclass -class PlaceOrderRequest: - blength: str - bwidth: str - type: str = "pcbfile" diff --git a/kicad_amf_plugin/gui/summary/price_model_base.py b/kicad_amf_plugin/gui/summary/price_model_base.py deleted file mode 100644 index 16dc56e..0000000 --- a/kicad_amf_plugin/gui/summary/price_model_base.py +++ /dev/null @@ -1,46 +0,0 @@ -from dataclasses import dataclass -from enum import Enum -import abc -import json - - -class PriceModelCol(Enum): - DESC = 0 - VALUE = DESC + 1 - COL_COUNT = VALUE + 1 - - -@dataclass -class PriceItem: - id: str - desc: str - value: float - parent: "PriceModelBase" - - -class PriceModelBase: - @abc.abstractclassmethod - def data(self, row: int, col: int): - pass - - @abc.abstractclassmethod - def name(self) -> "str": - pass - - @abc.abstractclassmethod - def sum(self): - pass - - @abc.abstractclassmethod - def get_items(self) -> "list[PriceItem]": - pass - - @abc.abstractclassmethod - def update(self, data: dict): - pass - - def item_names(self): - return [] - - def clear(self): - pass diff --git a/kicad_amf_plugin/gui/summary/price_summary_model.py b/kicad_amf_plugin/gui/summary/price_summary_model.py deleted file mode 100644 index d376baa..0000000 --- a/kicad_amf_plugin/gui/summary/price_summary_model.py +++ /dev/null @@ -1,169 +0,0 @@ -from dataclasses import dataclass -import wx.dataview as dv -from .bom_price_model import BomPriceModel -from .pcb_price_model import PCBPriceModel -from .smt_price_model import SmtPriceModel -from .price_model_base import PriceModelCol -from .price_model_base import PriceModelBase, PriceItem -from enum import Enum -from kicad_amf_plugin.settings.setting_manager import SETTING_MANAGER - - -class PriceCategory(Enum): - PCB = "pcb" - SMT = "smt" - BOM = "bom" - - -PRICE_KIND = 3 - - -@dataclass -class PriceSummary: - pcb_quantity: int = 0 - days: int = 0 - cost: int = 0 - - -class PriceSummaryModel(dv.PyDataViewModel): - def __init__(self): - dv.PyDataViewModel.__init__(self) - self.UseWeakRefs(True) - self.price_category: "dict[int,PriceModelBase]" = { - PriceCategory.PCB: PCBPriceModel(), - PriceCategory.SMT: SmtPriceModel(), - PriceCategory.BOM: BomPriceModel(), - } - self._days_cost = 0 - self._pcb_quantity = 0 - - @property - def day_cost(self): - return self._days_cost - - @property - def pcb_count(self): - return self._pcb_quantity - - def update_price(self, price: "dict"): - for i in PriceCategory.PCB, PriceCategory.SMT, PriceCategory.BOM: - if i.value in price: - self.price_category[i].update(price[i.value]) - self.Cleared() - - def get_sum(self): - s = 0 - for i in self.price_category: - s = s + self.price_category[i].sum() - return s - - def GetColumnCount(self): - return PriceModelCol.COL_COUNT - - def GetColumnType(self, col): - mapper = { - 0: "string", - 1: "string", - } - return mapper[col] - - def GetChildren(self, parent, children): - if not parent: - for cat in self.price_category: - children.append(self.ObjectToItem(self.price_category[cat])) - return PRICE_KIND - - # Otherwise we'll fetch the python object associated with the parent - # item and make DV items for each of its child objects. - node = self.ItemToObject(parent) - if isinstance(node, PriceModelBase): - for i in node.get_items(): - children.append(self.ObjectToItem(i)) - return len(node.get_items()) - return 0 - - def IsContainer(self, item): - # Return True if the item has children, False otherwise. - ##self.log.write("IsContainer\n") - - # The hidden root is a container - if not item: - return True - # and in this model the genre objects are containers - node = self.ItemToObject(item) - if isinstance(node, PriceModelBase): - return True - # but everything else (the song objects) are not - return False - - # def HasContainerColumns(self, item): - # self.log.write('HasContainerColumns\n') - # return True - - def GetParent(self, item): - # Return the item which is this item's parent. - ##self.log.write("GetParent\n") - - if not item: - return dv.NullDataViewItem - - node = self.ItemToObject(item) - if isinstance(node, PriceModelBase): - return dv.NullDataViewItem - elif isinstance(node, PriceItem): - return self.ObjectToItem(node.parent) - return dv.NullDataViewItem - - def HasValue(self, item, col): - # Overriding this method allows you to let the view know if there is any - # data at all in the cell. If it returns False then GetValue will not be - # called for this item and column. - node = self.ItemToObject(item) - if isinstance(node, PriceModelBase) or isinstance(node, PriceItem): - return True - return False - - def GetValue(self, item, col): - # Return the value to be displayed for this item and column. For this - # example we'll just pull the values from the data objects we - # associated with the items in GetChildren. - - # Fetch the data object for this item. - node = self.ItemToObject(item) - - if isinstance(node, PriceModelBase): - # Due to the HasValue implementation above, GetValue should only - # be called for the first column for PriceModelBase objects. We'll verify - # that with this assert. - if 0 == col: - return node.name() - else: - return f"{node.sum()}{SETTING_MANAGER.get_price_unit()}" - - elif isinstance(node, PriceItem): - mapper = { - 0: node.desc, - 1: f"{node.value}{SETTING_MANAGER.get_price_unit()}", - } - return mapper[col] - - else: - raise RuntimeError("unknown node type") - - def GetAttr(self, item, col, attr): - ##self.log.write('GetAttr') - node = self.ItemToObject(item) - if ( - isinstance(node, PCBPriceModel) - or isinstance(node, SmtPriceModel) - or isinstance(node, BomPriceModel) - ): - attr.SetColour("blue") - attr.SetBold(True) - return True - return False - - def clear_content(self): - for i in PriceCategory.PCB, PriceCategory.SMT, PriceCategory.BOM: - self.price_category[i].clear() - self.Cleared() diff --git a/kicad_amf_plugin/gui/summary/smt_price_model.py b/kicad_amf_plugin/gui/summary/smt_price_model.py deleted file mode 100644 index e607c24..0000000 --- a/kicad_amf_plugin/gui/summary/smt_price_model.py +++ /dev/null @@ -1,20 +0,0 @@ -from .price_model_base import PriceModelBase, PriceItem - - -class SmtPriceModel(PriceModelBase): - smt_price: float = 0 - - def data(self, row: int, col: int): - return 0 - - def name(self): - return _("SMT") - - def sum(self): - return 0 - - def get_items(self) -> "list[PriceItem]": - return [] - - def update(self, data: dict): - pass diff --git a/kicad_amf_plugin/gui/summary/summary_panel.py b/kicad_amf_plugin/gui/summary/summary_panel.py deleted file mode 100644 index 37b439f..0000000 --- a/kicad_amf_plugin/gui/summary/summary_panel.py +++ /dev/null @@ -1,116 +0,0 @@ -from .ui_summary_panel import UiSummaryPanel -from kicad_amf_plugin.icon import GetImagePath -from kicad_amf_plugin.language.lang_setting_pop_menu import LangSettingPopMenu -import wx -from .order_summary_model import OrderSummary, OrderSummaryModel -from .price_summary_model import PriceSummaryModel - -import wx.dataview as dv -from kicad_amf_plugin.settings.setting_manager import SETTING_MANAGER -from kicad_amf_plugin.gui.event.pcb_fabrication_evt_list import ( - UpdatePrice, - PlaceOrder, - OrderRegionChanged, -) - - -class SummaryPanel(UiSummaryPanel): - def __init__(self, *args, **kw): - super().__init__(*args, **kw) - - self.init_ui() - self.btn_set_language.Bind(wx.EVT_BUTTON, self.on_set_lang_clicked) - self.radio_box_order_region.Bind(wx.EVT_RADIOBOX, self.on_region_changed) - self.btn_update_price.Bind(wx.EVT_BUTTON, self.on_update_price_clicked) - self.btn_place_order.Bind(wx.EVT_BUTTON, self.on_place_order_clicked) - - def init_ui(self): - self.list_order_summary.AppendTextColumn( - _("Build Time"), - 0, - width=-1, - mode=dv.DATAVIEW_CELL_ACTIVATABLE, - align=wx.ALIGN_LEFT, - ) - self.list_order_summary.AppendTextColumn( - _("Qty"), - 1, - width=-1, - mode=dv.DATAVIEW_CELL_ACTIVATABLE, - align=wx.ALIGN_CENTER, - ) - self.list_order_summary.AppendTextColumn( - _("Price"), - 2, - width=-1, - mode=dv.DATAVIEW_CELL_ACTIVATABLE, - align=wx.ALIGN_LEFT, - ) - - self.list_order_summary.SetMinSize( - wx.Size(-1, SummaryPanel.GetLineHeight(self) * 3 + 30) - ) - self.model_order_summary = OrderSummaryModel() - self.list_order_summary.AssociateModel(self.model_order_summary) - - self.list_price_detail.AppendTextColumn( - _("Item"), - 0, - width=120, - mode=dv.DATAVIEW_CELL_ACTIVATABLE, - align=wx.ALIGN_LEFT, - ) - self.list_price_detail.AppendTextColumn( - _("Price"), - 1, - width=-1, - mode=dv.DATAVIEW_CELL_ACTIVATABLE, - align=wx.ALIGN_RIGHT, - ) - - self.model_price_summary = PriceSummaryModel() - self.list_price_detail.AssociateModel(self.model_price_summary) - self.radio_box_order_region.SetSelection(SETTING_MANAGER.order_region) - - def update_price_detail(self, price: "dict"): - self.model_price_summary.update_price(price) - - def get_total_price(self): - return self.model_price_summary.get_sum() - - def update_order_summary(self, price_summary: "list"): - self.model_order_summary.update_order_info(price_summary) - - def on_update_price_clicked(self, ev): - self.clear_content() - evt = UpdatePrice(id=-1) - wx.PostEvent(self.Parent, evt) - - def on_place_order_clicked(self, ev): - evt = PlaceOrder(id=-1) - wx.PostEvent(self.Parent, evt) - - def GetImagePath(self, bitmap_path): - return GetImagePath(bitmap_path) - - @staticmethod - def GetLineHeight(parent): - line = wx.TextCtrl(parent) - _, height = line.GetSize() - line.Destroy() - return height - - def on_set_lang_clicked(self, evt): - menu = LangSettingPopMenu(SETTING_MANAGER.language) - self.PopupMenu(menu) - menu.Destroy() - - def clear_content(self): - for i in self.model_order_summary, self.model_price_summary: - i.clear_content() - - def on_region_changed(self, evt): - SETTING_MANAGER.set_order_region(self.radio_box_order_region.GetSelection()) - self.clear_content() - ev = OrderRegionChanged(-1) - wx.PostEvent(self.Parent, ev) diff --git a/kicad_amf_plugin/gui/summary/ui_summary_panel.fbp b/kicad_amf_plugin/gui/summary/ui_summary_panel.fbp deleted file mode 100644 index 44c2e5c..0000000 --- a/kicad_amf_plugin/gui/summary/ui_summary_panel.fbp +++ /dev/null @@ -1,443 +0,0 @@ - - - - - ; - Python - 1 - source_name - 0 - 0 - - UTF-8 - connect - ui_summary_panel - 1000 - none - GetImagePath - - 1 - UiSummaryPanel - - . - - 1 - 1 - 1 - 1 - UI - 0 - 0 - 0 - - 0 - wxAUI_MGR_DEFAULT - - - 1 - 1 - impl_virtual - - - 0 - wxID_ANY - - - UiSummaryPanel - - -1,-1 - ; ; forward_declare - - 0 - - - wxTAB_TRAVERSAL - - - bSizer1 - wxVERTICAL - none - - 5 - wxALIGN_CENTER|wxEXPAND - 0 - - - bSizer3 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER|wxEXPAND - 1 - - wxID_ANY - Preference - - sbSizer4 - wxHORIZONTAL - 1 - none - - 5 - - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - "CN" "JP" "EU/USA" - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Order Region - 1 - - 0 - - - 0 - - 1 - radio_box_order_region - 1 - - - protected - 1 - - Resizable - 0 - 1 - - wxRA_SPECIFY_ROWS - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - PlateButton - 1 - self.btn_set_language=PlateButton(self,bmp= wx.Bitmap( self.GetImagePath(u"language.png" ),wx.BITMAP_TYPE_ANY ), style=PB_STYLE_GRADIENT ) - - 1 - - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - from kicad_amf_plugin.utils.platebtn import PlateButton ,PB_STYLE_GRADIENT - - 0 - - - 0 - - 1 - btn_set_language - 1 - - - protected - 1 - - Resizable - - 1 - - ; ; forward_declare - 0 - - - - - - - - - - - - 5 - wxEXPAND - 1 - - wxID_ANY - Cost detail - - sbSizer1 - wxVERTICAL - 1 - none - - 5 - wxALL|wxEXPAND - 1 - - - - 1 - 1 - - - 0 - wxID_ANY - - - list_price_detail - protected - - - wxDV_ROW_LINES|wxDV_VERT_RULES - ; ; forward_declare - - - - - - - - - - 5 - wxEXPAND|wxFIXED_MINSIZE - 0 - - wxID_ANY - Order Summary - -1,-1 - sbSizer41 - wxVERTICAL - 1 - none - - 5 - wxALL|wxEXPAND - 1 - - - - 1 - 1 - - - 0 - wxID_ANY - - - list_order_summary - protected - - - wxDV_ROW_LINES|wxDV_VERT_RULES - ; ; forward_declare - - - - - - - - - - 5 - wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND - 0 - - - bSizer31 - wxVERTICAL - none - - 5 - wxALIGN_CENTER|wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - PlateButton - 1 - self.btn_update_price=PlateButton(self,bmp= wx.Bitmap( self.GetImagePath("query.png" ),wx.BITMAP_TYPE_ANY ),style=PB_STYLE_GRADIENT ,label=_("Update Price")) - - 1 - - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - from kicad_amf_plugin.utils.platebtn import PlateButton ,PB_STYLE_GRADIENT - - 0 - - - 0 - - 1 - btn_update_price - 1 - - - protected - 1 - - Resizable - - 1 - - ; ; forward_declare - 0 - - - - - - - - 5 - wxALIGN_CENTER|wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - PlateButton - 1 - self.btn_place_order=PlateButton(self,bmp= wx.Bitmap( self.GetImagePath("cart.png" ),wx.BITMAP_TYPE_ANY ),style=PB_STYLE_GRADIENT ,label=_("Add to Cart")) - - 1 - - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - from kicad_amf_plugin.utils.platebtn import PlateButton ,PB_STYLE_GRADIENT,PB_STYLE_SQUARE - - 0 - - - 0 - - 1 - btn_place_order - 1 - - - protected - 1 - - Resizable - - 1 - - ; ; forward_declare - 0 - - - - - - - - - - - - diff --git a/kicad_amf_plugin/gui/summary/ui_summary_panel.py b/kicad_amf_plugin/gui/summary/ui_summary_panel.py deleted file mode 100644 index 4a0b0a8..0000000 --- a/kicad_amf_plugin/gui/summary/ui_summary_panel.py +++ /dev/null @@ -1,139 +0,0 @@ -# -*- coding: utf-8 -*- - -########################################################################### -## Python code generated with wxFormBuilder (version 3.10.1-0-g8feb16b3) -## http://www.wxformbuilder.org/ -## -## PLEASE DO *NOT* EDIT THIS FILE! -########################################################################### - -import wx -import wx.xrc -from kicad_amf_plugin.utils.platebtn import PlateButton, PB_STYLE_GRADIENT -import wx.dataview -from kicad_amf_plugin.utils.platebtn import ( - PlateButton, - PB_STYLE_GRADIENT, - PB_STYLE_SQUARE, -) - - -########################################################################### -## Class UiSummaryPanel -########################################################################### - - -class UiSummaryPanel(wx.Panel): - def __init__( - self, - parent, - id=wx.ID_ANY, - pos=wx.DefaultPosition, - size=wx.Size(-1, -1), - style=wx.TAB_TRAVERSAL, - name=wx.EmptyString, - ): - wx.Panel.__init__( - self, parent, id=id, pos=pos, size=size, style=style, name=name - ) - - bSizer1 = wx.BoxSizer(wx.VERTICAL) - - bSizer3 = wx.BoxSizer(wx.HORIZONTAL) - - sbSizer4 = wx.StaticBoxSizer( - wx.StaticBox(self, wx.ID_ANY, _("Preference")), wx.HORIZONTAL - ) - - radio_box_order_regionChoices = [_("CN"), _("JP"), _("EU/USA")] - self.radio_box_order_region = wx.RadioBox( - sbSizer4.GetStaticBox(), - wx.ID_ANY, - _("Order Region"), - wx.DefaultPosition, - wx.DefaultSize, - radio_box_order_regionChoices, - 1, - wx.RA_SPECIFY_ROWS, - ) - self.radio_box_order_region.SetSelection(0) - sbSizer4.Add(self.radio_box_order_region, 0, 0, 5) - - sbSizer4.Add((0, 0), 1, wx.EXPAND, 5) - - self.btn_set_language = PlateButton( - self, - bmp=wx.Bitmap(self.GetImagePath("language.png"), wx.BITMAP_TYPE_ANY), - style=PB_STYLE_GRADIENT, - ) - sbSizer4.Add(self.btn_set_language, 0, wx.ALL, 5) - - bSizer3.Add(sbSizer4, 1, wx.ALIGN_CENTER | wx.EXPAND, 5) - - bSizer1.Add(bSizer3, 0, wx.ALIGN_CENTER | wx.EXPAND, 5) - - sbSizer1 = wx.StaticBoxSizer( - wx.StaticBox(self, wx.ID_ANY, _("Cost detail")), wx.VERTICAL - ) - - self.list_price_detail = wx.dataview.DataViewCtrl( - sbSizer1.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - wx.dataview.DV_ROW_LINES | wx.dataview.DV_VERT_RULES, - ) - sbSizer1.Add(self.list_price_detail, 1, wx.ALL | wx.EXPAND, 5) - - bSizer1.Add(sbSizer1, 1, wx.EXPAND, 5) - - sbSizer41 = wx.StaticBoxSizer( - wx.StaticBox(self, wx.ID_ANY, _("Order Summary")), wx.VERTICAL - ) - - self.list_order_summary = wx.dataview.DataViewCtrl( - sbSizer41.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - wx.dataview.DV_ROW_LINES | wx.dataview.DV_VERT_RULES, - ) - sbSizer41.Add(self.list_order_summary, 1, wx.ALL | wx.EXPAND, 5) - - bSizer1.Add(sbSizer41, 0, wx.EXPAND | wx.FIXED_MINSIZE, 5) - - bSizer31 = wx.BoxSizer(wx.VERTICAL) - - self.btn_update_price = PlateButton( - self, - bmp=wx.Bitmap(self.GetImagePath("query.png"), wx.BITMAP_TYPE_ANY), - style=PB_STYLE_GRADIENT, - label=_("Update Price"), - ) - bSizer31.Add(self.btn_update_price, 1, wx.ALIGN_CENTER | wx.ALL | wx.EXPAND, 5) - - self.btn_place_order = PlateButton( - self, - bmp=wx.Bitmap(self.GetImagePath("cart.png"), wx.BITMAP_TYPE_ANY), - style=PB_STYLE_GRADIENT, - label=_("Add to Cart"), - ) - bSizer31.Add(self.btn_place_order, 1, wx.ALIGN_CENTER | wx.ALL | wx.EXPAND, 5) - - bSizer1.Add( - bSizer31, - 0, - wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, - 5, - ) - - self.SetSizer(bSizer1) - self.Layout() - bSizer1.Fit(self) - - def __del__(self): - pass - - # Virtual image path resolution method. Override this in your derived class. - def GetImagePath(self, bitmap_path): - return bitmap_path diff --git a/kicad_amf_plugin/icon/__init__.py b/kicad_amf_plugin/icon/__init__.py deleted file mode 100644 index 2b25d78..0000000 --- a/kicad_amf_plugin/icon/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -import os - -ICON_ROOT = os.path.dirname(__file__) - - -def GetImagePath(bitmap_path): - return os.path.join(ICON_ROOT, bitmap_path) diff --git a/kicad_amf_plugin/icon/cart.png b/kicad_amf_plugin/icon/cart.png deleted file mode 100644 index edd684b..0000000 Binary files a/kicad_amf_plugin/icon/cart.png and /dev/null differ diff --git a/kicad_amf_plugin/icon/icon.png b/kicad_amf_plugin/icon/icon.png deleted file mode 100644 index 1a4eabe..0000000 Binary files a/kicad_amf_plugin/icon/icon.png and /dev/null differ diff --git a/kicad_amf_plugin/icon/language.png b/kicad_amf_plugin/icon/language.png deleted file mode 100644 index e4c20e1..0000000 Binary files a/kicad_amf_plugin/icon/language.png and /dev/null differ diff --git a/kicad_amf_plugin/icon/query.png b/kicad_amf_plugin/icon/query.png deleted file mode 100644 index e0943d8..0000000 Binary files a/kicad_amf_plugin/icon/query.png and /dev/null differ diff --git a/kicad_amf_plugin/kicad/board_manager.py b/kicad_amf_plugin/kicad/board_manager.py deleted file mode 100644 index cb1a82b..0000000 --- a/kicad_amf_plugin/kicad/board_manager.py +++ /dev/null @@ -1,43 +0,0 @@ -from pcbnew import GetBoard, LoadBoard -import wx -import os - - -class BoardManager: - def __init__(self, board) -> None: - if board is None: - raise ("Empty kicad pcb board!") - self._board = board - - @property - def board(self): - return self._board - - -def load_board_manager(): - board = GetBoard() - if board: - return BoardManager(board) - else: - dlg = wx.FileDialog( - None, - message="Choose a kicad pcb file", - defaultDir=os.getcwd(), - defaultFile="", - wildcard="*.kicad_pcb", - style=wx.FD_OPEN - | wx.FD_MULTIPLE - | wx.FD_CHANGE_DIR - | wx.FD_FILE_MUST_EXIST - | wx.FD_PREVIEW, - ) - - # Show the dialog and retrieve the user response. If it is the OK response, - # process the data. - if dlg.ShowModal() == wx.ID_OK: - # This returns a Python list of files that were selected. - paths = dlg.GetPaths() - if len(paths): - board = LoadBoard(paths[0]) - dlg.Destroy() - return BoardManager(board) diff --git a/kicad_amf_plugin/language/__init__.py b/kicad_amf_plugin/language/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/language/geni18n.py b/kicad_amf_plugin/language/geni18n.py deleted file mode 100644 index c3fd104..0000000 --- a/kicad_amf_plugin/language/geni18n.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This will generate the .pot and .mo files for the application domain and -languages defined below. - -The .po and .mo files are placed as per convention in - -"appfolder/locale/lang/LC_MESSAGES" - -The .pot file is placed in the locale folder. - -This script or something similar should be added to your build process. - -The actual translation work is normally done using a tool like poEdit or -similar, it allows you to generate a particular language catalog from the .pot -file or to use the .pot to merge new translations into an existing language -catalog. - -""" -import subprocess -import sys -import os -from lang_const import CODE_TO_NAME, LANG_DOMAIN, DEFAULT_LANG - -# we remove English as source code strings are in English -supportedLang = [] -for code in CODE_TO_NAME: - if CODE_TO_NAME[code] != DEFAULT_LANG: - supportedLang.append(code) - - -appFolder = os.path.abspath( - os.path.join(os.path.dirname(os.path.abspath(__file__)), "..") -) - -# if False: -if os.name == "nt": - # setup some stuff to get at Python I18N tools/utilities - pyExe = sys.executable - pyFolder = os.path.split(pyExe)[0] - pyToolsFolder = os.path.join(pyFolder, "Tools") - pyI18nFolder = os.path.join(pyToolsFolder, "i18n") - pyGettext = os.path.join(pyI18nFolder, "pygettext.py") - pyMsgfmt = os.path.join(pyI18nFolder, "msgfmt.py") - outFolder = os.path.join(appFolder, "language", "locale") - # build command for pygettext - gtOptions = "-a -d %s -o %s.pot -p %s %s" - - tCmd = ( - pyExe - + " " - + pyGettext - + " " - + (gtOptions % (LANG_DOMAIN, LANG_DOMAIN, outFolder, appFolder)) - ) - print("Generating the .pot file") - print("cmd: %s" % tCmd) - rCode = subprocess.call(tCmd) - print("return code: %s\n\n" % rCode) - - for tLang in supportedLang: - # build command for msgfmt - langDir = os.path.join(appFolder, (f"language/locale/{tLang}/LC_MESSAGES")) - if not os.path.exists(langDir): - os.mkdir(langDir) - poFile = os.path.join(langDir, LANG_DOMAIN + ".po") - tCmd = pyExe + " " + pyMsgfmt + " " + poFile - - print("Generating the .mo file") - print("cmd: %s" % tCmd) - rCode = subprocess.call(tCmd) - print("return code: %s\n\n" % rCode) -else: - from pythongettext.msgfmt import Msgfmt - - # Simply run the msg format cmd to update the .mo on the Ubuntu ci server - for tLang in supportedLang: - # build command for msgfmt - langDir = os.path.join(appFolder, (f"language/locale/{tLang}/LC_MESSAGES")) - if not os.path.exists(langDir): - os.mkdir(langDir) - poFile = os.path.join(langDir, LANG_DOMAIN + ".po") - moFile = os.path.join(langDir, LANG_DOMAIN + ".mo") - generator = Msgfmt(poFile).get() - with open(moFile, "wb") as f: - f.write(generator) diff --git a/kicad_amf_plugin/language/lang_const.py b/kicad_amf_plugin/language/lang_const.py deleted file mode 100644 index ae111f1..0000000 --- a/kicad_amf_plugin/language/lang_const.py +++ /dev/null @@ -1,39 +0,0 @@ -# language domain -LANG_DOMAIN = "kicad_amf_plugin" - - -ENGLISH = "English" - -DEFAULT_LANG = ENGLISH - - -CODE_TO_NAME = {"en": "English", "ja": "Japanese", "zh_CN": "Chinese"} - - -def get_supported_language(): - import wx - - return ( - wx.LANGUAGE_ENGLISH, - wx.LANGUAGE_JAPANESE_JAPAN, - wx.LANGUAGE_CHINESE_SIMPLIFIED, - ) - - -def code_to_wx(): - import wx - - return { - "en": wx.LANGUAGE_ENGLISH, - "ja": wx.LANGUAGE_JAPANESE_JAPAN, - "zh_CN": wx.LANGUAGE_CHINESE_SIMPLIFIED, - } - - -def fool_translation(): - # Just for triggering the gettext - import wx - - _ = wx.GetTranslation - TRANSLATION = [_("English"), _("Japanese"), _("Chinese")] - return TRANSLATION diff --git a/kicad_amf_plugin/language/lang_setting_pop_menu.py b/kicad_amf_plugin/language/lang_setting_pop_menu.py deleted file mode 100644 index 3c8b719..0000000 --- a/kicad_amf_plugin/language/lang_setting_pop_menu.py +++ /dev/null @@ -1,35 +0,0 @@ -import wx -from .lang_const import CODE_TO_NAME, code_to_wx -from kicad_amf_plugin.settings.setting_manager import SETTING_MANAGER - - -WX_ID_MAP = code_to_wx() - - -class LangSettingPopMenu(wx.Menu): - def __init__(self, current_lang_id: int): - super().__init__() - for lang in enumerate(CODE_TO_NAME): - id, code = lang - item = wx.MenuItem(id=id, text=_(CODE_TO_NAME[code]), kind=wx.ITEM_CHECK) - wx_id = WX_ID_MAP[code] - if current_lang_id == wx_id: - item.Check(True) - else: - item.Check(False) - self.Append(item) - if wx.LANGUAGE_ENGLISH == wx_id: - self.Bind(wx.EVT_MENU, self.setup_en, id=id) - elif wx.LANGUAGE_JAPANESE_JAPAN == wx_id: - self.Bind(wx.EVT_MENU, self.setup_jp, id=id) - elif wx.LANGUAGE_CHINESE_SIMPLIFIED == wx_id: - self.Bind(wx.EVT_MENU, self.setup_zh, id=id) - - def setup_en(self, evt): - SETTING_MANAGER.set_language(wx.LANGUAGE_ENGLISH) - - def setup_jp(self, evt): - SETTING_MANAGER.set_language(wx.LANGUAGE_JAPANESE_JAPAN) - - def setup_zh(self, evt): - SETTING_MANAGER.set_language(wx.LANGUAGE_CHINESE_SIMPLIFIED) diff --git a/kicad_amf_plugin/language/locale/ja/LC_MESSAGES/kicad_amf_plugin.po b/kicad_amf_plugin/language/locale/ja/LC_MESSAGES/kicad_amf_plugin.po deleted file mode 100644 index 281cc1e..0000000 --- a/kicad_amf_plugin/language/locale/ja/LC_MESSAGES/kicad_amf_plugin.po +++ /dev/null @@ -1,740 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2023-10-23 09:59+0800\n" -"PO-Revision-Date: 2023-10-23 10:08+0800\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: ja\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 3.4\n" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\app_base.py:45 -msgid "Unsupported layer count!" -msgstr "ボードレイヤーの数はサポートされていません!" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\app_base.py:54 -msgid "" -"Restart the plugin to apply the new locale ?\n" -"For full translation(including the options), restarting KiCad is required" -msgstr "" -"プラグインを再起動して新しい言語設定を適用しますか?\n" -"完全な翻訳 (オプションを含む) が必要な場合は、KiCad を再起動してください" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\app_base.py:55 -msgid "Tip" -msgstr "先端" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\main_frame.py:75 -msgid "HQ NextPCB Active Manufacturing" -msgstr "HQネクストPCBアクティブ製造" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\main_frame.py:224 -msgid "No available url for querying price in current region" -msgstr "現在の地域の価格を照会するための使用可能なURLがありません" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\main_frame.py:244 -msgid "Incorrect form parameter: " -msgstr "フォームパラメータが正しくありません: " - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\main_frame.py:258 -msgid "No available url for placing order in current region" -msgstr "現在の地域で注文するための利用可能なURLがありません" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\bom_price_model.py:11 -msgid "BOM" -msgstr "BOM" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\order_summary_model.py:14 -msgid "days" -msgstr "日" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\order_summary_model.py:14 -msgid "hours" -msgstr "時" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:7 -msgid "testfee" -msgstr "受験料" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:8 -msgid "plate" -msgstr "撮影料" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:9 -msgid "clc" -msgstr "ボード料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:10 -msgid "gch" -msgstr "エンジニアリングコスト" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:11 -msgid "bgafee" -msgstr "bga料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:12 -msgid "impendancefee" -msgstr "インピーダンス料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:13 -msgid "pin" -msgstr "賦課手数料" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:14 -msgid "copperfee" -msgstr "銅厚料" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:15 -msgid "colorfee" -msgstr "カラー料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:16 -msgid "sprayfee" -msgstr "スパッタリング料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:17 -msgid "extraurgentfee" -msgstr "迅速な料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:18 -msgid "viasfee" -msgstr "ビア料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:19 -msgid "bankongfee" -msgstr "半穴料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:20 -msgid "utilizationfee" -msgstr "利用料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:21 -msgid "discountfee" -msgstr "優待額" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:22 -msgid "boardfee" -msgstr "貨物" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:23 -msgid "difficultyfee" -msgstr "難易度クラフト料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:24 -msgid "coverfee" -msgstr "はんだマスク適用料" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:25 -msgid "blindfee" -msgstr "ブラインド埋葬料" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:26 -msgid "pressingfee" -msgstr "ラミネート料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:27 -msgid "cjfee" -msgstr "沈没料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:28 -msgid "pthfee" -msgstr "めっきスルーホール料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:29 -msgid "viainpadfee" -msgstr "プレート内穴料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:30 -msgid "reportfee" -msgstr "報告料" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:31 -msgid "populerfee" -msgstr "人気のないクラフト料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:32 -msgid "paperfee" -msgstr "論文代" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:33 -msgid "userstampfee" -msgstr "ゲスト編集料なし" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:34 -msgid "acceptancefee" -msgstr "受入基準料" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:35 -msgid "crossfee" -msgstr "フォークボード料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:36 -msgid "invoicefee" -msgstr "請求手数料" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:37 -msgid "insurancefee" -msgstr "保険" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:38 -msgid "zkfee" -msgstr "掘削料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:39 -msgid "cutfee" -msgstr "カット料金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:40 -msgid "luocao" -msgstr "グルーブマークアップ" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:41 -msgid "luocheng" -msgstr "ロチェンマークアップ" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\smt_price_model.py:11 -msgid "SMT" -msgstr "SMT" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\summary_panel.py:29 -msgid "Build Time" -msgstr "納期" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\summary_panel.py:36 -msgid "Qty" -msgstr "量" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\summary_panel.py:43 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\summary_panel.py:64 -msgid "Price" -msgstr "価格" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\summary_panel.py:57 -msgid "Item" -msgstr "アイテム" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:45 -msgid "Preference" -msgstr "好み" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:48 -msgid "CN" -msgstr "CN" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:48 -msgid "EU/USA" -msgstr "EU/USA" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:48 -msgid "JP" -msgstr "JP" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:52 -msgid "Order Region" -msgstr "注文地域" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:76 -msgid "Cost detail" -msgstr "費用の詳細" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:91 -msgid "Order Summary" -msgstr "注文の概要" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:111 -msgid "Update Price" -msgstr "価格を更新する" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:119 -msgid "Add to Cart" -msgstr "カートに追加" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\language\lang_const.py:38 -msgid "Chinese" -msgstr "簡体字中国語" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\language\lang_const.py:38 -msgid "English" -msgstr "英語" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\language\lang_const.py:38 -msgid "Japanese" -msgstr "日本語" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:37 -msgid "Single Piece" -msgstr "単品出荷" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:38 -msgid "Panel by Customer" -msgstr "顧客別パネル" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:39 -msgid "Panel by NextPCB" -msgstr "連続チップ(NextPCBスペル)" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:50 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\special_process_view.py:14 -msgid "N/A" -msgstr "N/A" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:51 -msgid "Left & Right" -msgstr "左と右" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:52 -msgid "Top & Bottom" -msgstr "トップ&ボトム" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:53 -msgid "All 4 sides" -msgstr "全4面" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:120 -msgid "Panel Type X value isn't valid. Please input valid value." -msgstr "スライスの長さが無効です。有効な整数を入力してください。" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:121 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:128 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:136 -msgid "Error" -msgstr "エロー" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:127 -msgid "Panel Type Y value isn't valid. Please input valid value." -msgstr "連続幅が無効なため、有効な整数を入力してください。" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:135 -msgid "Break-away Rail value isn't valid. Please input valid value." -msgstr "プロセスフレームサイズが無効なため、有効な数値を入力してください。" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:324 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:207 -msgid "Size (single)" -msgstr "サイズ(シングル)" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:325 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:162 -msgid "Qty(single)" -msgstr "数量(シングル)" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:326 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:191 -msgid "Pcs" -msgstr "ある" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:328 -msgid "Size (set)" -msgstr "モノリシック サイズ" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:329 -msgid "Qty(Set)" -msgstr "連続するピースの数" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:330 -msgid "Set" -msgstr "Set" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:38 -msgid "Base Info" -msgstr "ベース情報" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:49 -msgid "Material Type" -msgstr "素材タイプ" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:56 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:70 -msgid "Non-conductive base material" -msgstr "非導電性基材" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:77 -msgid "Layer Count" -msgstr "レイヤー数" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:101 -msgid "Board TG" -msgstr "ボード TG" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:132 -msgid "Board Type" -msgstr "ボードタイプ" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:139 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:154 -msgid "The finished PCB are by single or by panel" -msgstr "完成したPCBは単一またはパネルごとです" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:219 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:315 -msgid "X:" -msgstr "X:" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:246 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:287 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:435 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:74 -msgid "mm" -msgstr "mm" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:260 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:356 -msgid "Y:" -msgstr "Y:" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:303 -msgid "Panel Type" -msgstr "パネルの種類" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:342 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:383 -msgid "pcs" -msgstr "pcs" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:401 -msgid "Break-away Rail" -msgstr "離脱レール" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:13 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:25 -msgid "Need" -msgstr "必要" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:14 -msgid "Need & Auto Confirm" -msgstr "&自動確認が必要" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:15 -msgid "Need & Manual Confirm" -msgstr "&手動確認が必要です" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:19 -msgid "Accept" -msgstr "受け入れる" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:20 -msgid "Reject" -msgstr "断る" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:26 -msgid "No need" -msgstr "必須ではありません" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:30 -msgid "Add customer stamp" -msgstr "顧客番号を追加する" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:31 -msgid "Add it to specified location" -msgstr "指定した場所にゲスト編集者を追加する" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:32 -msgid "Don't add customer stamp" -msgstr "ゲスト編集なし" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:36 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\utils\constraint.py:6 -msgid "Yes" -msgstr "はい" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:37 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:50 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\utils\constraint.py:6 -msgid "No" -msgstr "いいえ" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:42 -msgid "Sample Test Free" -msgstr "無料サンプルテスト" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:43 -msgid "AOI+Flying Test" -msgstr "AOI+飛行テスト" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:44 -msgid "AOI+Fixture" -msgstr "AOI+フィクスチャ" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:48 -msgid "Electronic" -msgstr "電子" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:48 -msgid "Paper" -msgstr "紙" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:50 -msgid "UL+Week/Year" -msgstr "UL+週/年" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:50 -msgid "UL+Year/Week" -msgstr "UL+年/週" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:35 -msgid "Personalized Service" -msgstr "パーソナライズされたサービス" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:46 -msgid "Electrical Test" -msgstr "電気試験" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:70 -msgid "Approve Working Gerber" -msgstr "作業中のガーバーを承認する" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:94 -msgid "Delivery Report" -msgstr "送達通知" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:118 -msgid "Microsection Analysis Report" -msgstr "微細断面分析レポート" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:142 -msgid "Report Format" -msgstr "レポート形式" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:166 -msgid "UL Mark" -msgstr "ULマーク" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:190 -msgid "Film" -msgstr "Film" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:214 -msgid "Cross Board" -msgstr "フォークプレート" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:238 -msgid "Bulkhead Paper" -msgstr "バルクヘッド紙" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:262 -msgid "User Stamp Process" -msgstr "顧客番号処理" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:286 -msgid "HQ Pack" -msgstr "NextPCB包装" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:311 -msgid "Special Request" -msgstr "特別なリクエスト" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:40 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:50 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:79 -msgid "Green" -msgstr "緑" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:41 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:51 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:80 -msgid "Red" -msgstr "赤" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:42 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:52 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:81 -msgid "Yellow" -msgstr "黄" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:43 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:53 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:82 -msgid "Blue" -msgstr "青" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:44 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:54 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:79 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:80 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:81 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:82 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:83 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:84 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:85 -msgid "White" -msgstr "白" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:45 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:55 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:84 -msgid "Matte Black" -msgstr "マットブラック" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:46 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:56 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:83 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:85 -msgid "Black" -msgstr "黒" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:61 -msgid "Tenting Vias" -msgstr "テンティングビア" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:62 -msgid "Vias not covered" -msgstr "ビアはカバーされていません" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:63 -msgid "Solder Mask Plug (IV-B)" -msgstr "ソルダーマスクプラグ(IV-B)" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:64 -msgid "Non-Conductive Fill" -msgstr "非導電性充填" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:68 -msgid "HASL" -msgstr "HASL" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:69 -msgid "Lead free HASL" -msgstr "鉛フリーHASL" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:70 -msgid "ENIG" -msgstr "ENIG" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:71 -msgid "OSP" -msgstr "OSP" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:34 -msgid "Process info" -msgstr "プロセス情報" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:45 -msgid "PCB Thickness" -msgstr "プリント基板の厚さ" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:88 -msgid "FInsihed Copper weight" -msgstr "仕上げられた銅の重量" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:112 -msgid "Inner Copper Weight" -msgstr "内側の銅の重量" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:136 -msgid "Min Trace/Space Outer" -msgstr "最小トレース/スペースアウター" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:160 -msgid "Min Drilled Hole" -msgstr "最小ドリル穴" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:184 -msgid "Solder Mask Color" -msgstr "はんだマスクの色" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:208 -msgid "Silkscreen" -msgstr "シルクスクリーン" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:232 -msgid "Via Process" -msgstr "プロセス経由" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:256 -msgid "Surface Finish" -msgstr "表面仕上げ" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:280 -msgid "Immersion Gold Thickness" -msgstr "浸漬金の厚さ" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\special_process_view.py:14 -msgid "Rank 1" -msgstr "ランク1" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\special_process_view.py:14 -msgid "Rank 2" -msgstr "ランク2" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\special_process_view.py:14 -msgid "Rank 3" -msgstr "ランク3" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\special_process_view.py:16 -msgid "Customer Specified Stack up" -msgstr "顧客指定のスタックアップ" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\special_process_view.py:16 -msgid "No Requirement" -msgstr "要件なし" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:34 -msgid "Special Process" -msgstr "特殊加工" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:45 -msgid "Impedance" -msgstr "インピーダンス" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:69 -msgid "Beveling of G/F" -msgstr "G/Fの面取り加工" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:93 -msgid "Plated Half Holes" -msgstr "メッキ半穴" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:117 -msgid "Pad Hole" -msgstr "パッド穴" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:141 -msgid "HDI(Buried/blind vais)" -msgstr "HDI(埋没/ブラインドゴーイング)" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:165 -msgid "HDI Structure" -msgstr "HDIの構造" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:189 -msgid "Stack up" -msgstr "積み重ねる" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:213 -msgid "Metallized Sides Count" -msgstr "" - -#~ msgid "Restart the plugin to apply the new locale ?" -#~ msgstr "プラグインを再起動して新しいロケールを適用しますか?" - -#~ msgid "en" -#~ msgstr "英語" - -#~ msgid "ja" -#~ msgstr "日本語" - -#~ msgid "zh_CN" -#~ msgstr "簡体字中国語" - -#~ msgid "PCB Quantity" -#~ msgstr "PCBの数量" - -#~ msgid "Time" -#~ msgstr "時間" - -#~ msgid "Cost" -#~ msgstr "料金" - -#~ msgid "$" -#~ msgstr "$" - -#~ msgid "jp" -#~ msgstr "日本語" diff --git a/kicad_amf_plugin/language/locale/zh_CN/LC_MESSAGES/generate_param_mapping.py b/kicad_amf_plugin/language/locale/zh_CN/LC_MESSAGES/generate_param_mapping.py deleted file mode 100644 index e2c9269..0000000 --- a/kicad_amf_plugin/language/locale/zh_CN/LC_MESSAGES/generate_param_mapping.py +++ /dev/null @@ -1,18 +0,0 @@ -import json - -mapping = {} -with open("kicad_amf_plugin.po", encoding="utf-8", errors="ignore") as f: - pair = [] - for line in f.readlines(): - if line.startswith("msgstr"): - pair.append((line.removeprefix("msgstr").strip()).replace('"', "")) - elif line.startswith("msgid"): - pair.append(line.removeprefix("msgid").strip().replace('"', "")) - if len(pair) == 2: - mapping[pair[0]] = pair[1] - pair = [] - - -with open("mapping.json", "w", encoding="utf-8") as f: - (json.dump(mapping, f, ensure_ascii=False)) - # f.write(str(mapping)) diff --git a/kicad_amf_plugin/language/locale/zh_CN/LC_MESSAGES/kicad_amf_plugin.po b/kicad_amf_plugin/language/locale/zh_CN/LC_MESSAGES/kicad_amf_plugin.po deleted file mode 100644 index 123b572..0000000 --- a/kicad_amf_plugin/language/locale/zh_CN/LC_MESSAGES/kicad_amf_plugin.po +++ /dev/null @@ -1,821 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2023-10-23 09:59+0800\n" -"PO-Revision-Date: 2023-10-23 10:07+0800\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: zh_CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 3.4\n" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\app_base.py:45 -msgid "Unsupported layer count!" -msgstr "板子层数不支持!" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\app_base.py:54 -msgid "" -"Restart the plugin to apply the new locale ?\n" -"For full translation(including the options), restarting KiCad is required" -msgstr "" -"是否重启插件以应用新的语言设置?\n" -"如果需要完全翻译(包括选项),请重启 KiCad" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\app_base.py:55 -msgid "Tip" -msgstr "提示" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\main_frame.py:75 -msgid "HQ NextPCB Active Manufacturing" -msgstr "HQ NextPCB Active Manufacturing" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\main_frame.py:224 -msgid "No available url for querying price in current region" -msgstr "当前区域无可询价接口" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\main_frame.py:244 -msgid "Incorrect form parameter: " -msgstr "无效的表单参数: " - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\main_frame.py:258 -msgid "No available url for placing order in current region" -msgstr "当前区域无可下单接口" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\bom_price_model.py:11 -msgid "BOM" -msgstr "BOM" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\order_summary_model.py:14 -msgid "days" -msgstr "天" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\order_summary_model.py:14 -msgid "hours" -msgstr "小时" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:7 -msgid "testfee" -msgstr "测试费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:8 -msgid "plate" -msgstr "菲林费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:9 -msgid "clc" -msgstr "板费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:10 -msgid "gch" -msgstr "工程费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:11 -msgid "bgafee" -msgstr "bga费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:12 -msgid "impendancefee" -msgstr "阻抗" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:13 -msgid "pin" -msgstr "拼版费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:14 -msgid "copperfee" -msgstr "铜厚费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:15 -msgid "colorfee" -msgstr "颜色费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:16 -msgid "sprayfee" -msgstr "喷镀费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:17 -msgid "extraurgentfee" -msgstr "加急费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:18 -msgid "viasfee" -msgstr "过孔费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:19 -msgid "bankongfee" -msgstr "半孔费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:20 -msgid "utilizationfee" -msgstr "使用费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:21 -msgid "discountfee" -msgstr "优惠金额" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:22 -msgid "boardfee" -msgstr "运费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:23 -msgid "difficultyfee" -msgstr "难度工艺费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:24 -msgid "coverfee" -msgstr "阻焊覆盖费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:25 -msgid "blindfee" -msgstr "盲埋孔费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:26 -msgid "pressingfee" -msgstr "叠层结构费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:27 -msgid "cjfee" -msgstr "沉金费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:28 -msgid "pthfee" -msgstr "电镀通孔费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:29 -msgid "viainpadfee" -msgstr "盘中孔费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:30 -msgid "reportfee" -msgstr "报告费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:31 -msgid "populerfee" -msgstr "冷门工艺费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:32 -msgid "paperfee" -msgstr "隔白纸费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:33 -msgid "userstampfee" -msgstr "不加客编费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:34 -msgid "acceptancefee" -msgstr "验收标准费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:35 -msgid "crossfee" -msgstr "打叉板费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:36 -msgid "invoicefee" -msgstr "发票费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:37 -msgid "insurancefee" -msgstr "保险费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:38 -msgid "zkfee" -msgstr "钻孔费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:39 -msgid "cutfee" -msgstr "割刀费" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:40 -msgid "luocao" -msgstr "罗槽加价" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\pcb_price_model.py:41 -msgid "luocheng" -msgstr "罗程加价" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\smt_price_model.py:11 -msgid "SMT" -msgstr "SMT" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\summary_panel.py:29 -msgid "Build Time" -msgstr "交期" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\summary_panel.py:36 -msgid "Qty" -msgstr "数量" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\summary_panel.py:43 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\summary_panel.py:64 -msgid "Price" -msgstr "价格" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\summary_panel.py:57 -msgid "Item" -msgstr "项目" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:45 -msgid "Preference" -msgstr "偏好设置" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:48 -msgid "CN" -msgstr "中国大陆" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:48 -msgid "EU/USA" -msgstr "欧美" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:48 -msgid "JP" -msgstr "日本" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:52 -msgid "Order Region" -msgstr "订购区域" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:76 -msgid "Cost detail" -msgstr "价格明细" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:91 -msgid "Order Summary" -msgstr "订单信息汇总" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:111 -msgid "Update Price" -msgstr "更新价格" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\gui\summary\ui_summary_panel.py:119 -msgid "Add to Cart" -msgstr "加入购物车" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\language\lang_const.py:38 -msgid "Chinese" -msgstr "简体中文" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\language\lang_const.py:38 -msgid "English" -msgstr "英文" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\language\lang_const.py:38 -msgid "Japanese" -msgstr "日文" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:37 -msgid "Single Piece" -msgstr "单片出货" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:38 -msgid "Panel by Customer" -msgstr "连片(按文件)" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:39 -msgid "Panel by NextPCB" -msgstr "连片(华秋代拼)" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:50 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\special_process_view.py:14 -msgid "N/A" -msgstr "无" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:51 -msgid "Left & Right" -msgstr "左右" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:52 -msgid "Top & Bottom" -msgstr "上下" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:53 -msgid "All 4 sides" -msgstr "四边" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:120 -msgid "Panel Type X value isn't valid. Please input valid value." -msgstr "连片长度无效,请输入有效整数." - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:121 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:128 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:136 -msgid "Error" -msgstr "错误" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:127 -msgid "Panel Type Y value isn't valid. Please input valid value." -msgstr "连片宽度无效,请输入有效整数." - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:135 -msgid "Break-away Rail value isn't valid. Please input valid value." -msgstr "工艺边框尺寸无效,请输入有效数字." - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:324 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:207 -msgid "Size (single)" -msgstr "单片尺寸" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:325 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:162 -msgid "Qty(single)" -msgstr "单片数量" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:326 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:191 -msgid "Pcs" -msgstr "片" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:328 -msgid "Size (set)" -msgstr "单片尺寸" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:329 -msgid "Qty(Set)" -msgstr "连片数量" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\base_info_view.py:330 -msgid "Set" -msgstr "Set" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:38 -msgid "Base Info" -msgstr "基础信息" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:49 -msgid "Material Type" -msgstr "板材" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:56 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:70 -msgid "Non-conductive base material" -msgstr "非导电基材" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:77 -msgid "Layer Count" -msgstr "板子层数" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:101 -msgid "Board TG" -msgstr "板子TG" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:132 -msgid "Board Type" -msgstr "出货形式" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:139 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:154 -msgid "The finished PCB are by single or by panel" -msgstr "单片或者连片出货" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:219 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:315 -msgid "X:" -msgstr "X:" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:246 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:287 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:435 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:74 -msgid "mm" -msgstr "mm" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:260 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:356 -msgid "Y:" -msgstr "Y:" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:303 -msgid "Panel Type" -msgstr "拼版规则" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:342 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:383 -msgid "pcs" -msgstr "片" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\base\ui_base_info.py:401 -msgid "Break-away Rail" -msgstr "工艺边框" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:13 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:25 -msgid "Need" -msgstr "需要" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:14 -msgid "Need & Auto Confirm" -msgstr "需要&自动确认" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:15 -msgid "Need & Manual Confirm" -msgstr "需要&手动确认" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:19 -msgid "Accept" -msgstr "接受" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:20 -msgid "Reject" -msgstr "拒绝" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:26 -msgid "No need" -msgstr "不需要" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:30 -msgid "Add customer stamp" -msgstr "加客编" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:31 -msgid "Add it to specified location" -msgstr "在指定位置加客编" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:32 -msgid "Don't add customer stamp" -msgstr "不加客编" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:36 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\utils\constraint.py:6 -msgid "Yes" -msgstr "是" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:37 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:50 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\utils\constraint.py:6 -msgid "No" -msgstr "否" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:42 -msgid "Sample Test Free" -msgstr "AOl+飞针抽测(免费)" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:43 -msgid "AOI+Flying Test" -msgstr "AOI+飞针全测" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:44 -msgid "AOI+Fixture" -msgstr "AOI+测试架" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:48 -msgid "Electronic" -msgstr "电子" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:48 -msgid "Paper" -msgstr "纸质" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:50 -msgid "UL+Week/Year" -msgstr "UL+周/年" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\personalized_info_view.py:50 -msgid "UL+Year/Week" -msgstr "UL+年/周" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:35 -msgid "Personalized Service" -msgstr "服务信息" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:46 -msgid "Electrical Test" -msgstr "测试方式" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:70 -msgid "Approve Working Gerber" -msgstr "确认生产稿" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:94 -msgid "Delivery Report" -msgstr "产品报告" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:118 -msgid "Microsection Analysis Report" -msgstr "显微切片分析报告" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:142 -msgid "Report Format" -msgstr "报告格式" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:166 -msgid "UL Mark" -msgstr "UL 标志" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:190 -msgid "Film" -msgstr "感光膜" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:214 -msgid "Cross Board" -msgstr "打叉板" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:238 -msgid "Bulkhead Paper" -msgstr "隔板纸" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:262 -msgid "User Stamp Process" -msgstr "客编处理" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:286 -msgid "HQ Pack" -msgstr "华秋包装" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\personalized\ui_personalized.py:311 -msgid "Special Request" -msgstr "特殊要求" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:40 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:50 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:79 -msgid "Green" -msgstr "绿" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:41 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:51 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:80 -msgid "Red" -msgstr "红" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:42 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:52 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:81 -msgid "Yellow" -msgstr "黄" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:43 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:53 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:82 -msgid "Blue" -msgstr "蓝" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:44 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:54 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:79 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:80 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:81 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:82 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:83 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:84 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:85 -msgid "White" -msgstr "白" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:45 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:55 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:84 -msgid "Matte Black" -msgstr "哑黑" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:46 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:56 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:83 -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:85 -msgid "Black" -msgstr "黑" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:61 -msgid "Tenting Vias" -msgstr "过孔盖油" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:62 -msgid "Vias not covered" -msgstr "过孔开窗" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:63 -msgid "Solder Mask Plug (IV-B)" -msgstr "过孔塞油墨" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:64 -msgid "Non-Conductive Fill" -msgstr "过孔塞树脂+电镀填平" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:68 -msgid "HASL" -msgstr "有铅喷锡" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:69 -msgid "Lead free HASL" -msgstr "无铅喷锡" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:70 -msgid "ENIG" -msgstr "沉金" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\process_info_view.py:71 -msgid "OSP" -msgstr "OSP" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:34 -msgid "Process info" -msgstr "工艺信息" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:45 -msgid "PCB Thickness" -msgstr "板子厚度" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:88 -msgid "FInsihed Copper weight" -msgstr "外层铜厚" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:112 -msgid "Inner Copper Weight" -msgstr "内层铜厚" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:136 -msgid "Min Trace/Space Outer" -msgstr "最小线宽/线距" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:160 -msgid "Min Drilled Hole" -msgstr "最小孔径" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:184 -msgid "Solder Mask Color" -msgstr "阻焊颜色" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:208 -msgid "Silkscreen" -msgstr "字符颜色" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:232 -msgid "Via Process" -msgstr "阻焊覆盖" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:256 -msgid "Surface Finish" -msgstr "表面处理" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\process\ui_process_info.py:280 -msgid "Immersion Gold Thickness" -msgstr "沉金厚度" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\special_process_view.py:14 -msgid "Rank 1" -msgstr "一阶" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\special_process_view.py:14 -msgid "Rank 2" -msgstr "二阶" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\special_process_view.py:14 -msgid "Rank 3" -msgstr "三阶" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\special_process_view.py:16 -msgid "Customer Specified Stack up" -msgstr "自定义堆叠方式" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\special_process_view.py:16 -msgid "No Requirement" -msgstr "无需求" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:34 -msgid "Special Process" -msgstr "特殊要求" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:45 -msgid "Impedance" -msgstr "阻抗" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:69 -msgid "Beveling of G/F" -msgstr "手指斜边" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:93 -msgid "Plated Half Holes" -msgstr "半孔" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:117 -msgid "Pad Hole" -msgstr "盘中孔" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:141 -msgid "HDI(Buried/blind vais)" -msgstr "HDI(埋地/盲走)" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:165 -msgid "HDI Structure" -msgstr "HDI结构" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:189 -msgid "Stack up" -msgstr "堆叠" - -#: C:\Users\ws\Documents\KiCad\7.0\scripting\plugins\kicad-amf-plugin\kicad_amf_plugin\pcb_fabrication\special_process\ui_special_process.py:213 -msgid "Metallized Sides Count" -msgstr "金属化边框数量" - -#~ msgid "Restart the plugin to apply the new locale ?" -#~ msgstr "重启插件以应用新的语言配置?" - -#~ msgid "PCB Quantity" -#~ msgstr "PCB数量" - -#~ msgid "Time" -#~ msgstr "时间" - -#~ msgid "Cost" -#~ msgstr "价格" - -#~ msgid "BGA isn't valid. Please input valid number." -#~ msgstr "BGA无效,请输入有效数字." - -#~ msgid "Turnhole density isn't valid. Please input valid number." -#~ msgstr "通孔密度无效,请输入有效数字." - -#~ msgid "BGA" -#~ msgstr "BGA" - -#~ msgid "Turnhole Density" -#~ msgstr "通孔密度" - -#~ msgid "en" -#~ msgstr "英语" - -#~ msgid "ja" -#~ msgstr "日语" - -#~ msgid "zh_CN" -#~ msgstr "中文简体" - -#~ msgid "Test point count isn't valid. Please input valid number." -#~ msgstr "测试点数量无效,请输入数字." - -#~ msgid "PCB design count isn't valid. Please input valid number." -#~ msgstr "PCB设计稿数量无效,请输入数字." - -#~ msgid "Designs Count" -#~ msgstr "设计稿数量" - -#~ msgid "Test Point Count" -#~ msgstr "测试点数量" - -#~ msgid "Unexpected response from server" -#~ msgstr "不符合预期的服务器响应" - -#~ msgid "$" -#~ msgstr "元" - -#~ msgid "Material Type:" -#~ msgstr "板材:" - -#~ msgid "FR-4" -#~ msgstr "FR-4" - -#~ msgid "Layer Count:" -#~ msgstr "板子层数:" - -#~ msgid "Board Type:" -#~ msgstr "出货形式:" - -#~ msgid "Panel Type:" -#~ msgstr "拼版规则:" - -#~ msgid "Size (single):" -#~ msgstr "单片尺寸:" - -#~ msgid "Qty(single):" -#~ msgstr "连片数量:" - -#~ msgid "Break-away Rail:" -#~ msgstr "工艺边框:" - -#~ msgid "PCB Thickness:" -#~ msgstr "板子厚度:" - -#~ msgid "Finished Copper Weight:" -#~ msgstr "外层铜厚:" - -#~ msgid "Inner Copper Weight:" -#~ msgstr "内层铜厚:" - -#~ msgid "Min Trace/Space Outer:" -#~ msgstr "最小线宽/线距:" - -#~ msgid "Min Drilled Hole:" -#~ msgstr "最小孔径:" - -#~ msgid "Solder Mask Color:" -#~ msgstr "阻焊颜色:" - -#~ msgid "Silkscreen:" -#~ msgstr "丝网印刷:" - -#~ msgid "Via Process:" -#~ msgstr "阻焊覆盖:" - -#~ msgid "Surface Finish:" -#~ msgstr "表面处理:" - -#~ msgid "Immersion Gold Thickness:" -#~ msgstr "沉金厚度:" - -#~ msgid "jp" -#~ msgstr "日语" diff --git a/kicad_amf_plugin/order/__init__.py b/kicad_amf_plugin/order/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/order/order_region.py b/kicad_amf_plugin/order/order_region.py deleted file mode 100644 index 8809572..0000000 --- a/kicad_amf_plugin/order/order_region.py +++ /dev/null @@ -1,29 +0,0 @@ -from enum import Enum -from .supported_region import SupportedRegion - - -class URL_KIND(Enum): - QUERY_PRICE = 0 - PLACE_ORDER = 1 - - -class OrderRegion: - AVAILABLE_URLS = { - SupportedRegion.CHINA_MAINLAND: { - URL_KIND.PLACE_ORDER: "https://www.hqpcb.com/External/fileQuote", - URL_KIND.QUERY_PRICE: "https://www.hqpcb.com/public/ajax_valuation", - }, - SupportedRegion.EUROPE_USA: { - URL_KIND.PLACE_ORDER: "https://www.nextpcb.com/Upfile/kiCadUpFile", - URL_KIND.QUERY_PRICE: "https://www.nextpcb.com/ajax/valuation", - }, - SupportedRegion.JAPAN: { - URL_KIND.PLACE_ORDER: "https://jp.nextpcb.com/Upfile/kiCadUpFile", - URL_KIND.QUERY_PRICE: "https://jp.nextpcb.com/ajax/valuation", - }, - } - - @staticmethod - def get_url(region: SupportedRegion, kind: URL_KIND): - if region in OrderRegion.AVAILABLE_URLS: - return OrderRegion.AVAILABLE_URLS[region][kind] diff --git a/kicad_amf_plugin/order/supported_region.py b/kicad_amf_plugin/order/supported_region.py deleted file mode 100644 index 967cdac..0000000 --- a/kicad_amf_plugin/order/supported_region.py +++ /dev/null @@ -1,4 +0,0 @@ -class SupportedRegion: - CHINA_MAINLAND = 0 - JAPAN = 1 - EUROPE_USA = 2 diff --git a/kicad_amf_plugin/pcb_fabrication/__init__.py b/kicad_amf_plugin/pcb_fabrication/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/pcb_fabrication/base/__init__.py b/kicad_amf_plugin/pcb_fabrication/base/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/pcb_fabrication/base/base_info_model.py b/kicad_amf_plugin/pcb_fabrication/base/base_info_model.py deleted file mode 100644 index 89bb3fd..0000000 --- a/kicad_amf_plugin/pcb_fabrication/base/base_info_model.py +++ /dev/null @@ -1,20 +0,0 @@ -from dataclasses import dataclass - - -@dataclass -class BaseInfoModel: - blayer: str # Layer Count - blength: str # GetPcbLength - bwidth: str # GetPcbWidth - bcount: str # Qty(single) - sidedirection: str # Decided by the marginMode automatically - - plate_type: str = "Fr-4" # Material Type - units: str = "2" # Board Type - layoutx: str = None # X - layouty: str = None # Y - sidewidth: str = None # Break-away Rail - - testpoint: int = 0 # 测试点数,默认为0 - pbnum: int = None # 拼版款数,指文件内不同款的板子个数, 不传默认为1 - board_tg: str = None # 4层及以上可选TG值,TG130、TG150、TG170 diff --git a/kicad_amf_plugin/pcb_fabrication/base/base_info_view.py b/kicad_amf_plugin/pcb_fabrication/base/base_info_view.py deleted file mode 100644 index 49813a3..0000000 --- a/kicad_amf_plugin/pcb_fabrication/base/base_info_view.py +++ /dev/null @@ -1,370 +0,0 @@ -from kicad_amf_plugin.kicad.board_manager import BoardManager -from kicad_amf_plugin.order.supported_region import SupportedRegion -from kicad_amf_plugin.settings.setting_manager import SETTING_MANAGER -from kicad_amf_plugin.settings.single_plugin import SINGLE_PLUGIN -from kicad_amf_plugin.utils.form_panel_base import FormKind, FormPanelBase -from .base_info_model import BaseInfoModel -from kicad_amf_plugin.gui.event.pcb_fabrication_evt_list import LayerCountChange -from .ui_base_info import ( - UiBaseInfo, - BOX_SIZE_SETTING, - BOX_PANEL_SETTING, - BOX_BREAK_AWAY, -) -from kicad_amf_plugin.utils.validators import ( - NumericTextCtrlValidator, - FloatTextCtrlValidator, -) -from kicad_amf_plugin.utils.roles import EditDisplayRole -from kicad_amf_plugin.settings.form_value_fitter import fitter_and_map_form_value -from kicad_amf_plugin.settings.supported_layer_count import AVAILABLE_LAYER_COUNTS - -import pcbnew -import wx - - -AVAILABLE_MATERIAL_TYPES = ["FR-4"] - -AVAILABLE_BOARD_TG_TYPES = ["TG130", "TG150", "TG170"] - - -class PcbPackageKind: - SINGLE_PIECE = 1 - PANEL_BY_CUSTOMER = 3 - PANEL_BY_NEXT_PCB = 2 - - PCB_PACKAGE_KIND = ( - EditDisplayRole(SINGLE_PIECE, _("Single Piece")), - EditDisplayRole(PANEL_BY_CUSTOMER, _("Panel by Customer")), - EditDisplayRole(PANEL_BY_NEXT_PCB, _("Panel by NextPCB")), - ) - - -class MarginMode: - NA = "N/A" - LEFT_RIGHT = "X" - TOP_BOTTOM = "Y" - ALL_4_SIDE = "XY" - - MARGIN_MODE_CHOICE = [ - EditDisplayRole(NA, _("N/A")), - EditDisplayRole(LEFT_RIGHT, _("Left & Right")), - EditDisplayRole(TOP_BOTTOM, _("Top & Bottom")), - EditDisplayRole(ALL_4_SIDE, _("All 4 sides")), - ] - - -AVAILABLE_QUANTITY = [ - 5, - 10, - 15, - 20, - 25, - 30, - 40, - 50, - 75, - 100, - 125, - 150, - 200, - 250, - 300, - 350, - 400, - 450, - 500, - 600, - 700, - 800, - 900, - 1000, - 1500, - 2000, - 2500, - 3000, - 3500, - 4000, - 4500, - 5000, - 5500, - 6000, - 6500, - 7000, - 7500, - 8000, - 9000, - 10000, -] - - -class BaseInfoView(UiBaseInfo, FormPanelBase): - def __init__(self, parent, board_manager: BoardManager): - super().__init__(parent) - self.board_manager = board_manager - - self.combo_pcb_package_kind.Bind(wx.EVT_CHOICE, self.on_pcb_packaging_changed) - self.comb_margin_mode.Bind(wx.EVT_CHOICE, self.on_margin_mode_changed) - self.combo_layer_count.Bind(wx.EVT_CHOICE, self.on_layer_count_changed) - for editor in self.edit_panel_x, self.edit_panel_y: - editor.SetValidator(NumericTextCtrlValidator()) - self.edit_margin_size.SetValidator(FloatTextCtrlValidator()) - - def is_valid(self) -> bool: - if ( - self.pcb_package_kind != PcbPackageKind.SINGLE_PIECE - and not self.should_apply_single_board_geometry() - ): - if not self.edit_panel_x.Validate(): - wx.MessageBox( - _("Panel Type X value isn't valid. Please input valid value."), - _("Error"), - wx.OK | wx.ICON_ERROR, - ) - return False - if not self.edit_panel_y.Validate(): - wx.MessageBox( - _("Panel Type Y value isn't valid. Please input valid value."), - _("Error"), - wx.OK | wx.ICON_ERROR, - ) - return False - if self.edit_margin_size.Enabled: - if not self.edit_margin_size.Validate(): - wx.MessageBox( - _("Break-away Rail value isn't valid. Please input valid value."), - _("Error"), - wx.OK | wx.ICON_ERROR, - ) - return False - return True - - @property - def box_piece_or_panel_size(self): - return self.FindWindowById(BOX_SIZE_SETTING) - - @property - def box_panel_setting(self): - return self.FindWindowById(BOX_PANEL_SETTING) - - @property - def box_break_away(self): - return self.FindWindowById(BOX_BREAK_AWAY) - - @property - def pcb_package_kind(self): - return PcbPackageKind.PCB_PACKAGE_KIND[ - int(self.combo_pcb_package_kind.GetSelection()) - ].EditRole - - @property - def margin_mode(self): - return MarginMode.MARGIN_MODE_CHOICE[ - int(self.comb_margin_mode.GetSelection()) - ].EditRole - - def should_apply_single_board_geometry(self): - return ( - self.pcb_package_kind == PcbPackageKind.SINGLE_PIECE - or SETTING_MANAGER.order_region == SupportedRegion.CHINA_MAINLAND - and self.pcb_package_kind - in (PcbPackageKind.SINGLE_PIECE, PcbPackageKind.PANEL_BY_CUSTOMER) - ) - - def get_pcb_length(self): - """Default is mm - - - Returns: - _type_: float - """ - if self.should_apply_single_board_geometry(): - if self.margin_mode in (MarginMode.LEFT_RIGHT, MarginMode.ALL_4_SIDE): - return ( - float(self.edit_size_x.GetValue()) - + float(self.edit_margin_size.GetValue()) * 2 - ) - else: - return float(self.edit_size_x.GetValue()) - else: - if self.margin_mode in (MarginMode.LEFT_RIGHT, MarginMode.ALL_4_SIDE): - return ( - float(self.edit_size_x.GetValue()) - * int(self.edit_panel_x.GetValue()) - + float(self.edit_margin_size.GetValue()) * 2 - ) - else: - return float(self.edit_size_x.GetValue()) * int( - self.edit_panel_x.GetValue() - ) - - def get_pcb_width(self): - """Default is mm - - - Returns: - _type_: float - """ - if self.should_apply_single_board_geometry(): - if self.margin_mode in (MarginMode.LEFT_RIGHT, MarginMode.ALL_4_SIDE): - return ( - float(self.edit_size_y.GetValue()) - + float(self.edit_margin_size.GetValue()) * 2 - ) - else: - return float(self.edit_size_y.GetValue()) - else: - if self.margin_mode in (MarginMode.LEFT_RIGHT, MarginMode.ALL_4_SIDE): - return ( - float(self.edit_size_y.GetValue()) - * int(self.edit_panel_y.GetValue()) - + float(self.edit_margin_size.GetValue()) * 2 - ) - else: - return float(self.edit_size_y.GetValue()) * int( - self.edit_panel_y.GetValue() - ) - - @fitter_and_map_form_value - def get_from(self, kind: FormKind) -> "dict": - data = BaseInfoModel( - blayer=self.combo_layer_count.GetStringSelection(), - plate_type=AVAILABLE_MATERIAL_TYPES[0], - board_tg=self.combo_board_tg.GetStringSelection() - if self.combo_board_tg.Enabled - else None, - units=str(self.pcb_package_kind), - blength=str( - FormPanelBase.convert_geometry( - kind, SETTING_MANAGER.order_region, self.get_pcb_length() - ) - ), - bwidth=str( - FormPanelBase.convert_geometry( - kind, SETTING_MANAGER.order_region, self.get_pcb_width() - ) - ), - bcount=self.combo_quantity.GetStringSelection(), - sidedirection=str(self.margin_mode), - ) - - if self.pcb_package_kind in ( - PcbPackageKind.PANEL_BY_CUSTOMER, - PcbPackageKind.PANEL_BY_NEXT_PCB, - ): - if not self.order_region_is_cn_and_package_by_customer(): - data.layoutx = self.edit_panel_x.GetValue() - data.layouty = self.edit_panel_y.GetValue() - - if self.margin_mode != MarginMode.NA: - data.sidewidth = self.edit_margin_size.GetValue() - - return vars(data) - - def order_region_is_cn_and_package_by_customer(self): - return ( - SETTING_MANAGER.order_region == SupportedRegion.CHINA_MAINLAND - and self.pcb_package_kind == PcbPackageKind.PANEL_BY_CUSTOMER - ) - - def init(self): - self.initUI() - self.loadBoardInfo() - - def getBaseInfo(self): - return self.base_info - - def initUI(self): - self.combo_material_type.Append(AVAILABLE_MATERIAL_TYPES) - self.combo_material_type.SetSelection(0) - - self.combo_layer_count.AppendItems([str(i) for i in AVAILABLE_LAYER_COUNTS]) - self.combo_layer_count.SetSelection(1) - - self.combo_pcb_package_kind.Append( - [i.DisplayRole for i in PcbPackageKind.PCB_PACKAGE_KIND] - ) - self.comb_margin_mode.Append( - [i.DisplayRole for i in MarginMode.MARGIN_MODE_CHOICE] - ) - - self.combo_quantity.Append([str(i) for i in AVAILABLE_QUANTITY]) - self.combo_quantity.SetSelection(0) - self.comb_margin_mode.SetSelection(0) - self.combo_pcb_package_kind.SetSelection(0) - - self.combo_board_tg.Append(AVAILABLE_BOARD_TG_TYPES) - self.combo_board_tg.SetSelection(0) - - for i in self.edit_size_x, self.edit_size_y: - i.SetEditable(False) - self.edit_margin_size.Enabled = False - self.box_panel_setting.Show( - self.pcb_package_kind != PcbPackageKind.SINGLE_PIECE - ) - - def loadBoardInfo(self): - boardWidth = pcbnew.ToMM( - self.board_manager.board.GetBoardEdgesBoundingBox().GetWidth() - ) - boardHeight = pcbnew.ToMM( - self.board_manager.board.GetBoardEdgesBoundingBox().GetHeight() - ) - layerCount = self.board_manager.board.GetCopperLayerCount() - self.combo_layer_count.SetSelection( - self.combo_layer_count.FindString(str(layerCount)) - ) - self.combo_layer_count.Enabled = False - self.edit_size_x.SetValue(str(boardWidth)) - self.edit_size_y.SetValue(str(boardHeight)) - self.combo_board_tg.Enabled = layerCount > 3 - - def on_pcb_packaging_changed(self, evt=None): - if self.pcb_package_kind == PcbPackageKind.SINGLE_PIECE: - self.box_piece_or_panel_size.SetLabelText(_("Size (single)")) - self.label_quantity.SetLabel(_("Qty(single)")) - self.label_quantity_unit.SetLabel(_("Pcs")) - else: - self.box_piece_or_panel_size.SetLabelText(_("Size (set)")) - self.label_quantity.SetLabel(_("Qty(Set)")) - self.label_quantity_unit.SetLabel(_("Set")) - - self.box_panel_setting.Show( - self.pcb_package_kind != PcbPackageKind.SINGLE_PIECE - and not self.order_region_is_cn_and_package_by_customer() - ) - self.box_break_away.Enabled = ( - self.pcb_package_kind != PcbPackageKind.PANEL_BY_CUSTOMER - ) - self.on_margin_mode_changed() - if SINGLE_PLUGIN.get_main_wind() is not None: - SINGLE_PLUGIN.get_main_wind().adjust_size() - - def on_margin_mode_changed(self, event=None): - self.edit_margin_size.Enabled = self.margin_mode != MarginMode.NA - if self.margin_mode == MarginMode.NA: - self.edit_margin_size.SetValue("0") - - def on_layer_count_changed(self, evt): - evt = LayerCountChange(id=-1) - count = int(self.combo_layer_count.GetStringSelection()) - evt.SetInt(count) - self.combo_board_tg.Enabled = count > 3 - wx.PostEvent(self.Parent, evt) - - def get_pcb_count(self): - n = int(self.combo_quantity.GetStringSelection()) - if ( - self.combo_pcb_package_kind.GetSelection() == 1 - or self.combo_pcb_package_kind.GetSelection() == 2 - ): - return ( - n - * int(self.edit_panel_x.GetValue()) - * int(self.edit_panel_y.GetValue()) - ) - else: - return n - - def on_region_changed(self): - self.on_pcb_packaging_changed(None) diff --git a/kicad_amf_plugin/pcb_fabrication/base/ui_base_info.fbp b/kicad_amf_plugin/pcb_fabrication/base/ui_base_info.fbp deleted file mode 100644 index 1fe74d2..0000000 --- a/kicad_amf_plugin/pcb_fabrication/base/ui_base_info.fbp +++ /dev/null @@ -1,1918 +0,0 @@ - - - - - ; - Python - 1 - source_name - 0 - 0 - res - UTF-8 - connect - ui_base_info - 1000 - none - - - 1 - UiBaseInfo - - . - - 1 - 1 - 1 - 1 - UI - 0 - 0 - 0 - - 0 - wxAUI_MGR_DEFAULT - - - 1 - 1 - impl_virtual - - - 0 - wxID_ANY - - - UiBaseInfo - - -1,-1 - ; ; forward_declare - - 0 - - - wxTAB_TRAVERSAL - - wxID_ANY - Base Info - - sbSizer2 - wxVERTICAL - 1 - none - - 5 - wxEXPAND - 0 - - 2 - wxBOTH - 1 - - 0 - - fgSizer2 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Material Type - 0 - - 0 - - - 0 - - 1 - m_staticText3 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - Non-conductive base material - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_material_type - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - Non-conductive base material - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Layer Count - 0 - - 0 - - - 0 - - 1 - m_staticText4 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_layer_count - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Board TG - 0 - - 0 - - - 0 - - 1 - m_staticText18 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_board_tg - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - 5 - wxEXPAND - 0 - - 2 - wxHORIZONTAL - 1 - - 0 - - fgSizer3 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Board Type - 0 - - 0 - - - 0 - - 1 - m_staticText5 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - The finished PCB are by single or by panel - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_pcb_package_kind - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - The finished PCB are by single or by panel - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Qty(single) - 0 - - 0 - - - 0 - - 1 - label_quantity - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 2 - wxBOTH - 0 - - 0 - - fgSizer21 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_quantity - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Pcs - 0 - - 0 - - - 0 - - 1 - label_quantity_unit - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - - - - - 5 - wxEXPAND - 0 - - - bSizer2 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - BOX_SIZE_SETTING - Size (single) - - box_piece_or_panel_size - wxVERTICAL - 1 - none - - 5 - wxEXPAND - 1 - - 2 - wxBOTH - 1 - - 0 - - fgSizer41 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - X: - 0 - - 0 - - - 0 - - 1 - m_staticText82 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 2 - wxBOTH - 0 - - 0 - - fgSizer62 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - edit_size_x - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - mm - 0 - - 0 - - - 0 - - 1 - m_staticText102 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Y: - 0 - - 0 - - - 0 - - 1 - m_staticText811 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 2 - wxBOTH - 0 - - 0 - - fgSizer611 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - edit_size_y - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - mm - 0 - - 0 - - - 0 - - 1 - m_staticText1011 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - - - - - - - 5 - wxEXPAND - 1 - - BOX_PANEL_SETTING - Panel Type - - sbSizer21 - wxVERTICAL - 1 - none - - 5 - wxEXPAND - 1 - - 2 - wxBOTH - 1 - - 0 - - fgSizer4 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - X: - 0 - - 0 - - - 0 - - 1 - m_staticText8 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 2 - wxBOTH - 0 - - 0 - - fgSizer6 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - edit_panel_x - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - pcs - 0 - - 0 - - - 0 - - 1 - m_staticText10 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Y: - 0 - - 0 - - - 0 - - 1 - m_staticText81 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 2 - wxBOTH - 0 - - 0 - - fgSizer61 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - edit_panel_y - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - pcs - 0 - - 0 - - - 0 - - 1 - m_staticText101 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - - - - - - - - - 5 - wxEXPAND - 0 - - BOX_BREAK_AWAY - Break-away Rail - - sbSizer12 - wxVERTICAL - 1 - none - - 5 - wxEXPAND - 1 - - 3 - wxBOTH - 1 - - 0 - - fgSizer24 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - comb_margin_mode - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - edit_margin_size - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - mm - 0 - - 0 - - - 0 - - 1 - m_staticText39 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - - - - - - - diff --git a/kicad_amf_plugin/pcb_fabrication/base/ui_base_info.py b/kicad_amf_plugin/pcb_fabrication/base/ui_base_info.py deleted file mode 100644 index a94d1e9..0000000 --- a/kicad_amf_plugin/pcb_fabrication/base/ui_base_info.py +++ /dev/null @@ -1,453 +0,0 @@ -# -*- coding: utf-8 -*- - -########################################################################### -## Python code generated with wxFormBuilder (version 3.10.1-0-g8feb16b3) -## http://www.wxformbuilder.org/ -## -## PLEASE DO *NOT* EDIT THIS FILE! -########################################################################### - -import wx -import wx.xrc - - -BOX_SIZE_SETTING = 1000 -BOX_PANEL_SETTING = 1001 -BOX_BREAK_AWAY = 1002 - -########################################################################### -## Class UiBaseInfo -########################################################################### - - -class UiBaseInfo(wx.Panel): - def __init__( - self, - parent, - id=wx.ID_ANY, - pos=wx.DefaultPosition, - size=wx.Size(-1, -1), - style=wx.TAB_TRAVERSAL, - name=wx.EmptyString, - ): - wx.Panel.__init__( - self, parent, id=id, pos=pos, size=size, style=style, name=name - ) - - sbSizer2 = wx.StaticBoxSizer( - wx.StaticBox(self, wx.ID_ANY, _("Base Info")), wx.VERTICAL - ) - - fgSizer2 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer2.AddGrowableCol(1) - fgSizer2.SetFlexibleDirection(wx.BOTH) - fgSizer2.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - self.m_staticText3 = wx.StaticText( - sbSizer2.GetStaticBox(), - wx.ID_ANY, - _("Material Type"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText3.Wrap(-1) - - self.m_staticText3.SetToolTip(_("Non-conductive base material")) - - fgSizer2.Add(self.m_staticText3, 0, wx.ALL, 5) - - combo_material_typeChoices = [] - self.combo_material_type = wx.Choice( - sbSizer2.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_material_typeChoices, - 0, - ) - self.combo_material_type.SetSelection(0) - self.combo_material_type.SetToolTip(_("Non-conductive base material")) - - fgSizer2.Add(self.combo_material_type, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText4 = wx.StaticText( - sbSizer2.GetStaticBox(), - wx.ID_ANY, - _("Layer Count"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText4.Wrap(-1) - - fgSizer2.Add(self.m_staticText4, 0, wx.ALL, 5) - - combo_layer_countChoices = [] - self.combo_layer_count = wx.Choice( - sbSizer2.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_layer_countChoices, - 0, - ) - self.combo_layer_count.SetSelection(0) - fgSizer2.Add(self.combo_layer_count, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText18 = wx.StaticText( - sbSizer2.GetStaticBox(), - wx.ID_ANY, - _("Board TG"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText18.Wrap(-1) - - fgSizer2.Add(self.m_staticText18, 0, wx.ALL, 5) - - combo_board_tgChoices = [] - self.combo_board_tg = wx.Choice( - sbSizer2.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_board_tgChoices, - 0, - ) - self.combo_board_tg.SetSelection(0) - fgSizer2.Add(self.combo_board_tg, 0, wx.ALL | wx.EXPAND, 5) - - sbSizer2.Add(fgSizer2, 0, wx.EXPAND, 5) - - fgSizer3 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer3.AddGrowableCol(1) - fgSizer3.SetFlexibleDirection(wx.HORIZONTAL) - fgSizer3.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - self.m_staticText5 = wx.StaticText( - sbSizer2.GetStaticBox(), - wx.ID_ANY, - _("Board Type"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText5.Wrap(-1) - - self.m_staticText5.SetToolTip(_("The finished PCB are by single or by panel")) - - fgSizer3.Add(self.m_staticText5, 0, wx.ALL, 5) - - combo_pcb_package_kindChoices = [] - self.combo_pcb_package_kind = wx.Choice( - sbSizer2.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_pcb_package_kindChoices, - 0, - ) - self.combo_pcb_package_kind.SetSelection(0) - self.combo_pcb_package_kind.SetToolTip( - _("The finished PCB are by single or by panel") - ) - - fgSizer3.Add(self.combo_pcb_package_kind, 0, wx.ALL | wx.EXPAND, 5) - - self.label_quantity = wx.StaticText( - sbSizer2.GetStaticBox(), - wx.ID_ANY, - _("Qty(single)"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.label_quantity.Wrap(-1) - - fgSizer3.Add(self.label_quantity, 0, wx.ALL, 5) - - fgSizer21 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer21.AddGrowableCol(0) - fgSizer21.SetFlexibleDirection(wx.BOTH) - fgSizer21.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - combo_quantityChoices = [] - self.combo_quantity = wx.Choice( - sbSizer2.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_quantityChoices, - 0, - ) - self.combo_quantity.SetSelection(0) - fgSizer21.Add(self.combo_quantity, 0, wx.ALL | wx.EXPAND, 5) - - self.label_quantity_unit = wx.StaticText( - sbSizer2.GetStaticBox(), - wx.ID_ANY, - _("Pcs"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.label_quantity_unit.Wrap(-1) - - fgSizer21.Add(self.label_quantity_unit, 0, wx.ALL, 5) - - fgSizer3.Add(fgSizer21, 1, wx.EXPAND, 5) - - sbSizer2.Add(fgSizer3, 0, wx.EXPAND, 5) - - bSizer2 = wx.BoxSizer(wx.VERTICAL) - - box_piece_or_panel_size = wx.StaticBoxSizer( - wx.StaticBox(sbSizer2.GetStaticBox(), BOX_SIZE_SETTING, _("Size (single)")), - wx.VERTICAL, - ) - - fgSizer41 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer41.AddGrowableCol(1) - fgSizer41.SetFlexibleDirection(wx.BOTH) - fgSizer41.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - self.m_staticText82 = wx.StaticText( - box_piece_or_panel_size.GetStaticBox(), - wx.ID_ANY, - _("X:"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText82.Wrap(-1) - - fgSizer41.Add(self.m_staticText82, 0, wx.ALL, 5) - - fgSizer62 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer62.AddGrowableCol(0) - fgSizer62.SetFlexibleDirection(wx.BOTH) - fgSizer62.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - self.edit_size_x = wx.TextCtrl( - box_piece_or_panel_size.GetStaticBox(), - wx.ID_ANY, - wx.EmptyString, - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - fgSizer62.Add(self.edit_size_x, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText102 = wx.StaticText( - box_piece_or_panel_size.GetStaticBox(), - wx.ID_ANY, - _("mm"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText102.Wrap(-1) - - fgSizer62.Add(self.m_staticText102, 0, wx.ALL, 5) - - fgSizer41.Add(fgSizer62, 1, wx.EXPAND, 5) - - self.m_staticText811 = wx.StaticText( - box_piece_or_panel_size.GetStaticBox(), - wx.ID_ANY, - _("Y:"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText811.Wrap(-1) - - fgSizer41.Add(self.m_staticText811, 0, wx.ALL, 5) - - fgSizer611 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer611.AddGrowableCol(0) - fgSizer611.SetFlexibleDirection(wx.BOTH) - fgSizer611.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - self.edit_size_y = wx.TextCtrl( - box_piece_or_panel_size.GetStaticBox(), - wx.ID_ANY, - wx.EmptyString, - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - fgSizer611.Add(self.edit_size_y, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText1011 = wx.StaticText( - box_piece_or_panel_size.GetStaticBox(), - wx.ID_ANY, - _("mm"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText1011.Wrap(-1) - - fgSizer611.Add(self.m_staticText1011, 0, wx.ALL, 5) - - fgSizer41.Add(fgSizer611, 1, wx.EXPAND, 5) - - box_piece_or_panel_size.Add(fgSizer41, 1, wx.EXPAND, 5) - - bSizer2.Add(box_piece_or_panel_size, 1, wx.EXPAND, 5) - - sbSizer21 = wx.StaticBoxSizer( - wx.StaticBox(sbSizer2.GetStaticBox(), BOX_PANEL_SETTING, _("Panel Type")), - wx.VERTICAL, - ) - - fgSizer4 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer4.AddGrowableCol(1) - fgSizer4.SetFlexibleDirection(wx.BOTH) - fgSizer4.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - self.m_staticText8 = wx.StaticText( - sbSizer21.GetStaticBox(), - wx.ID_ANY, - _("X:"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText8.Wrap(-1) - - fgSizer4.Add(self.m_staticText8, 0, wx.ALL, 5) - - fgSizer6 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer6.AddGrowableCol(0) - fgSizer6.SetFlexibleDirection(wx.BOTH) - fgSizer6.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - self.edit_panel_x = wx.TextCtrl( - sbSizer21.GetStaticBox(), - wx.ID_ANY, - wx.EmptyString, - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - fgSizer6.Add(self.edit_panel_x, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText10 = wx.StaticText( - sbSizer21.GetStaticBox(), - wx.ID_ANY, - _("pcs"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText10.Wrap(-1) - - fgSizer6.Add(self.m_staticText10, 0, wx.ALL, 5) - - fgSizer4.Add(fgSizer6, 1, wx.EXPAND, 5) - - self.m_staticText81 = wx.StaticText( - sbSizer21.GetStaticBox(), - wx.ID_ANY, - _("Y:"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText81.Wrap(-1) - - fgSizer4.Add(self.m_staticText81, 0, wx.ALL, 5) - - fgSizer61 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer61.AddGrowableCol(0) - fgSizer61.SetFlexibleDirection(wx.BOTH) - fgSizer61.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - self.edit_panel_y = wx.TextCtrl( - sbSizer21.GetStaticBox(), - wx.ID_ANY, - wx.EmptyString, - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - fgSizer61.Add(self.edit_panel_y, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText101 = wx.StaticText( - sbSizer21.GetStaticBox(), - wx.ID_ANY, - _("pcs"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText101.Wrap(-1) - - fgSizer61.Add(self.m_staticText101, 0, wx.ALL, 5) - - fgSizer4.Add(fgSizer61, 1, wx.EXPAND, 5) - - sbSizer21.Add(fgSizer4, 1, wx.EXPAND, 5) - - bSizer2.Add(sbSizer21, 1, wx.EXPAND, 5) - - sbSizer2.Add(bSizer2, 0, wx.EXPAND, 5) - - sbSizer12 = wx.StaticBoxSizer( - wx.StaticBox(sbSizer2.GetStaticBox(), BOX_BREAK_AWAY, _("Break-away Rail")), - wx.VERTICAL, - ) - - fgSizer24 = wx.FlexGridSizer(0, 3, 0, 0) - fgSizer24.AddGrowableCol(1) - fgSizer24.SetFlexibleDirection(wx.BOTH) - fgSizer24.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - comb_margin_modeChoices = [] - self.comb_margin_mode = wx.Choice( - sbSizer12.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - comb_margin_modeChoices, - 0, - ) - self.comb_margin_mode.SetSelection(0) - fgSizer24.Add(self.comb_margin_mode, 0, wx.ALL | wx.EXPAND, 5) - - self.edit_margin_size = wx.TextCtrl( - sbSizer12.GetStaticBox(), - wx.ID_ANY, - wx.EmptyString, - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - fgSizer24.Add(self.edit_margin_size, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText39 = wx.StaticText( - sbSizer12.GetStaticBox(), - wx.ID_ANY, - _("mm"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText39.Wrap(-1) - - fgSizer24.Add(self.m_staticText39, 0, wx.ALL, 5) - - sbSizer12.Add(fgSizer24, 1, wx.EXPAND, 5) - - sbSizer2.Add(sbSizer12, 0, wx.EXPAND, 5) - - self.SetSizer(sbSizer2) - self.Layout() - sbSizer2.Fit(self) - - def __del__(self): - pass diff --git a/kicad_amf_plugin/pcb_fabrication/personalized/__init__.py b/kicad_amf_plugin/pcb_fabrication/personalized/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/pcb_fabrication/personalized/personalized_info_model.py b/kicad_amf_plugin/pcb_fabrication/personalized/personalized_info_model.py deleted file mode 100644 index 0c7af50..0000000 --- a/kicad_amf_plugin/pcb_fabrication/personalized/personalized_info_model.py +++ /dev/null @@ -1,19 +0,0 @@ -from dataclasses import dataclass - - -@dataclass -class PersonalizedInfoModel: - test: str # Electrical Test - shipment_report: str # Delivery Report - slice_report: str # Microsection Analysis Report - report_type: str # Report Format - review_file: str # Approve Working Gerber: 确认生产稿 0无需 1需要-自动确认 2需要-非自动确认 - has_period: str # Decided by period_format - period_format: str or None # UL Mark - film_report: str # Film - pcb_note: str # Special Requests # Non-CN - - cross_board: int # 打叉板 1接受 2不接受 - paper: int # 隔白纸 1无需 2需要 - user_stamp: int # 不加客编 1无要求 2指定位置加客编 3不加客编 - hq_pack: int = None # 包装要求,默认 1华秋包装,0中性包装 #CN only diff --git a/kicad_amf_plugin/pcb_fabrication/personalized/personalized_info_view.py b/kicad_amf_plugin/pcb_fabrication/personalized/personalized_info_view.py deleted file mode 100644 index 903bbcf..0000000 --- a/kicad_amf_plugin/pcb_fabrication/personalized/personalized_info_view.py +++ /dev/null @@ -1,156 +0,0 @@ -from kicad_amf_plugin.order.order_region import OrderRegion, SupportedRegion -from kicad_amf_plugin.settings.setting_manager import SETTING_MANAGER -from kicad_amf_plugin.settings.form_value_fitter import fitter_and_map_form_value -from .personalized_info_model import PersonalizedInfoModel -from .ui_personalized import UiPersonalizedService, BOX_SP_REQUEST -from kicad_amf_plugin.utils.constraint import BOOLEAN_CHOICE -from .personalized_info_model import PersonalizedInfoModel -from kicad_amf_plugin.utils.form_panel_base import FormKind, FormPanelBase -from kicad_amf_plugin.utils.roles import EditDisplayRole - - -REVIEW_FILE_OPTION = [ - EditDisplayRole(0, _("Need")), - EditDisplayRole(1, _("Need & Auto Confirm")), - EditDisplayRole(2, _("Need & Manual Confirm")), -] - -CROSS_BOARD = [ - EditDisplayRole(1, _("Accept")), - EditDisplayRole(2, _("Reject")), -] - - -PAPER = [ - EditDisplayRole(1, _("Need")), - EditDisplayRole(2, _("No need")), -] - -USER_STAMP = [ - EditDisplayRole(1, _("Add customer stamp")), - EditDisplayRole(2, _("Add it to specified location")), - EditDisplayRole(3, _("Don't add customer stamp")), -] - -HQ_PACK = [ - EditDisplayRole(1, _("Yes")), - EditDisplayRole(0, _("No")), -] - - -TEST_METHOD_CHOICE = { - _("Sample Test Free"): "Sample Test Free", - _("AOI+Flying Test"): "Batch Flying Probe Test", - _("AOI+Fixture"): "Batch Fixture Test", -} - - -REPORT_FORMAT_CHOICE = [_("Paper"), _("Electronic")] - -UL_MARK_CHOICE = [_("No"), _("UL+Week/Year"), _("UL+Year/Week")] - - -class PersonalizedInfoView(UiPersonalizedService, FormPanelBase): - def __init__(self, parent, _): - super().__init__(parent) - self.special_process: PersonalizedInfoModel = None - self.initUI() - - def initUI(self): - # NOTE It seems that all tests are free now - self.comb_test_method.Append([i for i in TEST_METHOD_CHOICE]) - self.comb_test_method.SetSelection(0) - - for ctrl in ( - self.combo_microsection_report, - self.comb_film, - self.comb_delivery_report, - ): - for i in BOOLEAN_CHOICE: - ctrl.Append(_(i)) - ctrl.SetSelection(0) - - self.comb_report_format.Append(REPORT_FORMAT_CHOICE) - self.comb_report_format.SetSelection(1) - - self.comb_ul_mark.Append(UL_MARK_CHOICE) - self.comb_ul_mark.SetSelection(0) - - map = { - self.comb_approve_gerber: REVIEW_FILE_OPTION, - self.combo_cross_board: CROSS_BOARD, - self.combo_paper: PAPER, - self.combo_user_stamp: USER_STAMP, - self.combo_hq_pack: HQ_PACK, - } - map = { - self.comb_approve_gerber: REVIEW_FILE_OPTION, - self.combo_cross_board: CROSS_BOARD, - self.combo_paper: PAPER, - self.combo_user_stamp: USER_STAMP, - self.combo_hq_pack: HQ_PACK, - } - for comb in map: - comb.Append([i.DisplayRole for i in map[comb]]) - comb.SetSelection(0) - - @fitter_and_map_form_value - def get_from(self, kind: FormKind) -> "dict": - info = PersonalizedInfoModel( - test=TEST_METHOD_CHOICE[self.comb_test_method.StringSelection] - if self.comb_test_method.Shown - else None, - shipment_report=str(self.comb_delivery_report.GetSelection()), - slice_report=str(self.combo_microsection_report.GetSelection()), - report_type=str(self.GetReportType()), - review_file=REVIEW_FILE_OPTION[ - int(self.comb_approve_gerber.GetSelection()) - ].EditRole, - has_period=str(self.GetHasPeriod()), - period_format=self.GetPeriodFormat() - if self.comb_ul_mark.GetSelection() - else None, - film_report=str(self.comb_film.GetSelection()), - cross_board=CROSS_BOARD[self.combo_cross_board.GetSelection()].EditRole, - paper=PAPER[self.combo_paper.GetSelection()].EditRole, - user_stamp=USER_STAMP[self.combo_user_stamp.GetSelection()].EditRole, - hq_pack=HQ_PACK[int(self.combo_hq_pack.GetSelection())].EditRole - if self.combo_hq_pack.Shown - else None, - pcb_note=self.edit_special_request.GetValue() - if self.edit_special_request.Shown - else None, - ) - return vars(info) - - def GetReportType(self): - if ( - self.comb_delivery_report.GetSelection() == 0 - and self.combo_microsection_report.GetSelection() == 0 - ): - return 0 - elif self.comb_report_format.GetSelection() == 0: - return 2 - elif self.comb_report_format.GetSelection() == 1: - return 1 - - def GetHasPeriod(self): - if self.comb_ul_mark.GetSelection() == 0: - return "2" - else: - return "6" - - @property - def sp_box(self): - return self.FindWindowById(BOX_SP_REQUEST) - - def GetPeriodFormat(self): - if self.comb_ul_mark.GetSelection() == 1: - return "2" - elif self.comb_ul_mark.GetSelection() == 2: - return "1" - - def on_region_changed(self): - for i in self.combo_hq_pack, self.label_hq_pack: - i.Show(SETTING_MANAGER.order_region == SupportedRegion.CHINA_MAINLAND) - self.sp_box.Show(SETTING_MANAGER.order_region != SupportedRegion.CHINA_MAINLAND) diff --git a/kicad_amf_plugin/pcb_fabrication/personalized/ui_personalized.fbp b/kicad_amf_plugin/pcb_fabrication/personalized/ui_personalized.fbp deleted file mode 100644 index 6b72798..0000000 --- a/kicad_amf_plugin/pcb_fabrication/personalized/ui_personalized.fbp +++ /dev/null @@ -1,1537 +0,0 @@ - - - - - ; - Python - 1 - source_name - 0 - 0 - res - UTF-8 - connect - ui_personalized - 1030 - none - - - 1 - MyProject2 - - . - - 1 - 1 - 1 - 1 - UI - 0 - 0 - 0 - - 0 - wxAUI_MGR_DEFAULT - - - 1 - 1 - impl_virtual - - - 0 - wxID_ANY - - - UiPersonalizedService - - -1,-1 - ; ; forward_declare - - 0 - - - wxTAB_TRAVERSAL - - wxID_ANY - Personalized Service - - labelProcessInfo - wxVERTICAL - 1 - none - - 5 - wxEXPAND - 0 - - 2 - wxBOTH - 1 - - 0 - - fgSizer25 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Electrical Test - 0 - - 0 - - - 0 - - 1 - label_electric_test - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - comb_test_method - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Approve Working Gerber - 0 - - 0 - - - 0 - - 1 - m_staticText4011 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - comb_approve_gerber - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Delivery Report - 0 - - 0 - - - 0 - - 1 - m_staticText40111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_microsection_report - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Microsection Analysis Report - 0 - - 0 - - - 0 - - 1 - m_staticText401111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - comb_delivery_report - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Report Format - 0 - - 0 - - - 0 - - 1 - m_staticText4011111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - comb_report_format - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - UL Mark - 0 - - 0 - - - 0 - - 1 - m_staticText40111111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - comb_ul_mark - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Film - 0 - - 0 - - - 0 - - 1 - label_stackup - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - comb_film - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Cross Board - 0 - - 0 - - - 0 - - 1 - m_staticText8 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_cross_board - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Bulkhead Paper - 0 - - 0 - - - 0 - - 1 - m_staticText9 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_paper - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - User Stamp Process - 0 - - 0 - - - 0 - - 1 - m_staticText10 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_user_stamp - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - HQ Pack - 0 - - 0 - - - 0 - - 1 - label_hq_pack - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_hq_pack - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - 5 - wxEXPAND - 1 - - BOX_SP_REQUEST - Special Request - - sp_box - wxVERTICAL - 1 - none - - 5 - wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - -1,60 - 1 - edit_special_request - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_MULTILINE - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - diff --git a/kicad_amf_plugin/pcb_fabrication/personalized/ui_personalized.py b/kicad_amf_plugin/pcb_fabrication/personalized/ui_personalized.py deleted file mode 100644 index 360322e..0000000 --- a/kicad_amf_plugin/pcb_fabrication/personalized/ui_personalized.py +++ /dev/null @@ -1,335 +0,0 @@ -# -*- coding: utf-8 -*- - -########################################################################### -## Python code generated with wxFormBuilder (version 3.10.1-0-g8feb16b3) -## http://www.wxformbuilder.org/ -## -## PLEASE DO *NOT* EDIT THIS FILE! -########################################################################### - -import wx -import wx.xrc - -BOX_SP_REQUEST = 1030 - -########################################################################### -## Class UiPersonalizedService -########################################################################### - - -class UiPersonalizedService(wx.Panel): - def __init__( - self, - parent, - id=wx.ID_ANY, - pos=wx.DefaultPosition, - size=wx.Size(-1, -1), - style=wx.TAB_TRAVERSAL, - name=wx.EmptyString, - ): - wx.Panel.__init__( - self, parent, id=id, pos=pos, size=size, style=style, name=name - ) - - labelProcessInfo = wx.StaticBoxSizer( - wx.StaticBox(self, wx.ID_ANY, _("Personalized Service")), wx.VERTICAL - ) - - fgSizer25 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer25.AddGrowableCol(1) - fgSizer25.SetFlexibleDirection(wx.BOTH) - fgSizer25.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - self.label_electric_test = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Electrical Test"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.label_electric_test.Wrap(-1) - - fgSizer25.Add(self.label_electric_test, 0, wx.ALL, 5) - - comb_test_methodChoices = [] - self.comb_test_method = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - comb_test_methodChoices, - 0, - ) - self.comb_test_method.SetSelection(0) - fgSizer25.Add(self.comb_test_method, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText4011 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Approve Working Gerber"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText4011.Wrap(-1) - - fgSizer25.Add(self.m_staticText4011, 0, wx.ALL, 5) - - comb_approve_gerberChoices = [] - self.comb_approve_gerber = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - comb_approve_gerberChoices, - 0, - ) - self.comb_approve_gerber.SetSelection(0) - fgSizer25.Add(self.comb_approve_gerber, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText40111 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Delivery Report"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText40111.Wrap(-1) - - fgSizer25.Add(self.m_staticText40111, 0, wx.ALL, 5) - - combo_microsection_reportChoices = [] - self.combo_microsection_report = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_microsection_reportChoices, - 0, - ) - self.combo_microsection_report.SetSelection(0) - fgSizer25.Add(self.combo_microsection_report, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText401111 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Microsection Analysis Report"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText401111.Wrap(-1) - - fgSizer25.Add(self.m_staticText401111, 0, wx.ALL, 5) - - comb_delivery_reportChoices = [] - self.comb_delivery_report = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - comb_delivery_reportChoices, - 0, - ) - self.comb_delivery_report.SetSelection(0) - fgSizer25.Add(self.comb_delivery_report, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText4011111 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Report Format"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText4011111.Wrap(-1) - - fgSizer25.Add(self.m_staticText4011111, 0, wx.ALL, 5) - - comb_report_formatChoices = [] - self.comb_report_format = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - comb_report_formatChoices, - 0, - ) - self.comb_report_format.SetSelection(0) - fgSizer25.Add(self.comb_report_format, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText40111111 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("UL Mark"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText40111111.Wrap(-1) - - fgSizer25.Add(self.m_staticText40111111, 0, wx.ALL, 5) - - comb_ul_markChoices = [] - self.comb_ul_mark = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - comb_ul_markChoices, - 0, - ) - self.comb_ul_mark.SetSelection(0) - fgSizer25.Add(self.comb_ul_mark, 0, wx.ALL | wx.EXPAND, 5) - - self.label_stackup = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Film"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.label_stackup.Wrap(-1) - - fgSizer25.Add(self.label_stackup, 0, wx.ALL, 5) - - comb_filmChoices = [] - self.comb_film = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - comb_filmChoices, - 0, - ) - self.comb_film.SetSelection(0) - fgSizer25.Add(self.comb_film, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText8 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Cross Board"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText8.Wrap(-1) - - fgSizer25.Add(self.m_staticText8, 0, wx.ALL, 5) - - combo_cross_boardChoices = [] - self.combo_cross_board = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_cross_boardChoices, - 0, - ) - self.combo_cross_board.SetSelection(0) - fgSizer25.Add(self.combo_cross_board, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText9 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Bulkhead Paper"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText9.Wrap(-1) - - fgSizer25.Add(self.m_staticText9, 0, wx.ALL, 5) - - combo_paperChoices = [] - self.combo_paper = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_paperChoices, - 0, - ) - self.combo_paper.SetSelection(0) - fgSizer25.Add(self.combo_paper, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText10 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("User Stamp Process"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText10.Wrap(-1) - - fgSizer25.Add(self.m_staticText10, 0, wx.ALL, 5) - - combo_user_stampChoices = [] - self.combo_user_stamp = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_user_stampChoices, - 0, - ) - self.combo_user_stamp.SetSelection(0) - fgSizer25.Add(self.combo_user_stamp, 0, wx.ALL | wx.EXPAND, 5) - - self.label_hq_pack = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("HQ Pack"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.label_hq_pack.Wrap(-1) - - fgSizer25.Add(self.label_hq_pack, 0, wx.ALL, 5) - - combo_hq_packChoices = [] - self.combo_hq_pack = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_hq_packChoices, - 0, - ) - self.combo_hq_pack.SetSelection(0) - fgSizer25.Add(self.combo_hq_pack, 0, wx.ALL | wx.EXPAND, 5) - - labelProcessInfo.Add(fgSizer25, 0, wx.EXPAND, 5) - - sp_box = wx.StaticBoxSizer( - wx.StaticBox( - labelProcessInfo.GetStaticBox(), BOX_SP_REQUEST, _("Special Request") - ), - wx.VERTICAL, - ) - - self.edit_special_request = wx.TextCtrl( - sp_box.GetStaticBox(), - wx.ID_ANY, - wx.EmptyString, - wx.DefaultPosition, - wx.DefaultSize, - wx.TE_MULTILINE, - ) - self.edit_special_request.SetMinSize(wx.Size(-1, 60)) - - sp_box.Add(self.edit_special_request, 1, wx.ALL | wx.EXPAND, 5) - - labelProcessInfo.Add(sp_box, 1, wx.EXPAND, 5) - - self.SetSizer(labelProcessInfo) - self.Layout() - labelProcessInfo.Fit(self) - - def __del__(self): - pass diff --git a/kicad_amf_plugin/pcb_fabrication/process/__init__.py b/kicad_amf_plugin/pcb_fabrication/process/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/pcb_fabrication/process/process_info_model.py b/kicad_amf_plugin/pcb_fabrication/process/process_info_model.py deleted file mode 100644 index 2c5fed8..0000000 --- a/kicad_amf_plugin/pcb_fabrication/process/process_info_model.py +++ /dev/null @@ -1,15 +0,0 @@ -from dataclasses import dataclass - - -@dataclass -class ProcessInfoModel: - bheight: str # PCB Thickness - copper: str # Finished Copper Weight - lineweight: str # Min Trace/Space Outer - vias: str # Min Drilled Hole - color: str # Solder Mask Color - charcolor: str # Silkscreen - cover: str # Via Process - spray: str # Surface Finish - insidecopper: str = "0" # Inner Copper Weight - cjh: str = None # SurfaceProcessCtrl diff --git a/kicad_amf_plugin/pcb_fabrication/process/process_info_view.py b/kicad_amf_plugin/pcb_fabrication/process/process_info_view.py deleted file mode 100644 index c42d5af..0000000 --- a/kicad_amf_plugin/pcb_fabrication/process/process_info_view.py +++ /dev/null @@ -1,307 +0,0 @@ -from kicad_amf_plugin.kicad.board_manager import BoardManager -from kicad_amf_plugin.settings.form_value_fitter import fitter_and_map_form_value -from .process_info_model import ProcessInfoModel -from kicad_amf_plugin.utils.form_panel_base import FormKind, FormPanelBase - - -from .ui_process_info import UiProcessInfo -import wx -import pcbnew -from pcbnew import PCB_TRACK, PCB_TRACE_T, PCB_ARC_T, PCB_VIA_T - - -THICKNESS_SETTING = { - "1": ["0.6", "0.8", "1.0", "1.2", "1.6"], - "2": ["0.6", "0.8", "1.0", "1.2", "1.6"], - "4": ["0.6", "0.8", "1.0", "1.2", "1.6", "2.0", "2.5"], - "6": ["1.0", "1.2", "1.6", "2.0", "2.5"], - "8": ["1.2", "1.6", "2.0", "2.5"], - "10": ["1.2", "1.6", "2.0", "2.5"], - "12": ["1.6", "2.0", "2.5"], - "14": ["1.6", "2.0", "2.5", "3.0"], - "16": ["2.0", "2.5", "3.0"], - "18": ["2.0", "2.5", "3.0", "3.2"], - "20": ["2.0", "2.5", "3.0", "3.2"], -} - -OZ = "oz" - -OUTER_THICKNESS_CHOICE = [1, 2] - - -INNER_COPPER_THICKNESS_CHOICE = [0.5, 1, 2] - -MIL = "mil" - -MIN_TRACE_WIDTH_CLEARANCE_CHOICE = [10, 8, 6, 5, 4, 3.5] -MIN_HOLE_SIZE_CHOICE = [0.3, 0.25, 0.2, 0.15] - -MM = "mm" - -DEFAULT_MIN_TRACK_WIDTH = 6 - -KNOW_COLOR_MAPPING = { - _("Green"): "Green", - _("Red"): "Red", - _("Yellow"): "Yellow", - _("Blue"): "Blue", - _("White"): "White", - _("Matte Black"): "Matte Black", - _("Black"): "Black", -} - -SOLDER_COLOR_CHOICE = [ - _("Green"), - _("Red"), - _("Yellow"), - _("Blue"), - _("White"), - _("Matte Black"), - _("Black"), -] - - -SOLDER_COVER_CHOICE = { - _("Tenting Vias"): "Tenting Vias", - _("Vias not covered"): "Vias not covered", - _("Solder Mask Plug (IV-B)"): "Solder Mask Plug (IV-B)", - _("Non-Conductive Fill"): "Non-Conductive Fill & Cap (VII)", -} - -SURFACE_PROCESS_CHOICE = { - _("HASL"): "HASL", - _("Lead free HASL"): "Lead free HASL", - _("ENIG"): "ENIG", - _("OSP"): "OSP", -} - -GOLD_THICKNESS_CHOICE = [1, 2, 3] - -GOLD_THICKNESS_CHOICE_UNIT = "µm" - -SILK_SCREEN_COLOR_BY_SOLDER_COLOR = { - _("Green"): [_("White")], - _("Red"): [_("White")], - _("Yellow"): [_("White")], - _("Blue"): [_("White")], - _("White"): [_("Black")], - _("Matte Black"): [_("White")], - _("Black"): [_("White")], -} - - -class ProcessInfoView(UiProcessInfo, FormPanelBase): - def __init__(self, parent, board_manager: BoardManager): - super().__init__(parent) - self.board_manager = board_manager - - self.combo_surface_process.Bind(wx.EVT_CHOICE, self.on_surface_process_changed) - self.combo_solder_color.Bind(wx.EVT_CHOICE, self.OnMaskColorChange) - - self.Fit() - - @fitter_and_map_form_value - def get_from(self, kind: FormKind) -> "dict": - info = ProcessInfoModel( - bheight=self.combo_board_thickness.GetStringSelection(), - copper=str( - self.combo_outer_copper_thickness.GetStringSelection() - ).removesuffix(OZ), - lineweight=str( - self.combo_min_trace_width_clearance.GetStringSelection() - ).split("/")[0], - vias=str(self.combo_min_hole_size.GetStringSelection()).removesuffix(MM), - color=KNOW_COLOR_MAPPING[self.combo_solder_color.GetStringSelection()], - charcolor=KNOW_COLOR_MAPPING[ - self.combo_silk_screen_color.GetStringSelection() - ], - cover=SOLDER_COVER_CHOICE[self.combo_solder_cover.GetStringSelection()], - spray=SURFACE_PROCESS_CHOICE[ - self.combo_surface_process.GetStringSelection() - ], - ) - if self.layer_count > 2: - info.insidecopper = str( - self.combo_inner_copper_thickness.GetStringSelection() - ).removesuffix(OZ) - if self.combo_surface_process.GetCurrentSelection() == 2: - info.cjh = str(self.combo_gold_thickness.GetCurrentSelection() + 1) - return vars(info) - - def init(self): - self.initUI() - self.loadBoardInfo() - - def initUI(self): - self.combo_board_thickness.Append(THICKNESS_SETTING["1"]) - self.combo_board_thickness.SetSelection(4) - - self.combo_outer_copper_thickness.Append( - [f"{i}{OZ}" for i in OUTER_THICKNESS_CHOICE] - ) - self.combo_outer_copper_thickness.SetSelection(0) - - self.combo_inner_copper_thickness.Append( - [f"{i}{OZ}" for i in INNER_COPPER_THICKNESS_CHOICE] - ) - self.combo_inner_copper_thickness.SetSelection(0) - - self.combo_min_trace_width_clearance.Append( - [f"{i}/{i}{MIL}" for i in MIN_TRACE_WIDTH_CLEARANCE_CHOICE] - ) - self.combo_min_trace_width_clearance.SetSelection(2) - - self.combo_min_hole_size.Append([f"{i}{MM}" for i in MIN_HOLE_SIZE_CHOICE]) - self.combo_min_hole_size.SetSelection(0) - - self.combo_solder_color.Append(SOLDER_COLOR_CHOICE) - self.combo_solder_color.SetSelection(0) - - self.combo_silk_screen_color.Append( - SILK_SCREEN_COLOR_BY_SOLDER_COLOR[ - self.combo_solder_color.GetStringSelection() - ] - ) - self.combo_silk_screen_color.SetSelection(0) - - self.combo_solder_cover.Append([i for i in SOLDER_COVER_CHOICE]) - self.combo_solder_cover.SetSelection(0) - - self.combo_surface_process.Append([i for i in SURFACE_PROCESS_CHOICE]) - self.combo_surface_process.SetSelection(0) - - self.combo_gold_thickness.Append( - [f"{i}{GOLD_THICKNESS_CHOICE_UNIT}" for i in GOLD_THICKNESS_CHOICE] - ) - self.combo_gold_thickness.SetSelection(0) - - @property - def layer_count(self): - return self.board_manager.board.GetCopperLayerCount() - - def get_board_thickness_in_kicad_setting(self): - return self.board_manager.board.GetDesignSettings().GetBoardThickness() - - def loadBoardInfo(self): - for i in self.label_immersion_gold, self.combo_gold_thickness: - i.Show(False) - - self.combo_inner_copper_thickness.Enabled = self.layer_count > 2 - self.setup_board_thickness_choice(self.layer_count) - self.setup_trace_and_via() - - def setup_board_thickness_choice(self, event): - layer_count = event if isinstance(event, int) else event.GetInt() - self.combo_board_thickness.Clear() - val_list = THICKNESS_SETTING[str(layer_count)] - self.combo_board_thickness.Append(val_list) - self.set_board_thickness( - pcbnew.ToMM(self.get_board_thickness_in_kicad_setting()) - ) - - def on_surface_process_changed(self, evt=None): - for i in self.label_immersion_gold, self.combo_gold_thickness: - i.Show(self.combo_surface_process.GetSelection() == 2) - self.Layout() - self.Parent.Layout() - - def set_board_thickness(self, thickness): - for i in range(self.combo_board_thickness.GetCount()): - if thickness <= float(self.combo_board_thickness.GetString(i)): - self.combo_board_thickness.SetSelection(i) - break - - def set_min_trace(self, minTraceWidth, minTraceClearance): - if minTraceWidth == 0 and minTraceClearance == 0: - minTrace = 6 - elif minTraceWidth == 0: - minTrace = minTraceClearance - elif minTraceClearance == 0: - minTrace = minTraceWidth - else: - minTrace = min(minTraceWidth, minTraceClearance) - - if minTrace == 0: - minTrace = 6 - self.combo_min_trace_width_clearance.SetSelection(2) - elif minTrace > 8: - minTrace = 10 - self.combo_min_trace_width_clearance.SetSelection(0) - elif minTrace > 6: - minTrace = 8 - self.combo_min_trace_width_clearance.SetSelection(1) - elif minTrace > 5: - minTrace = 6 - self.combo_min_trace_width_clearance.SetSelection(2) - elif minTrace > 4: - minTrace = 5 - self.combo_min_trace_width_clearance.SetSelection(3) - elif minTrace > 3.5: - minTrace = 4 - self.combo_min_trace_width_clearance.SetSelection(4) - else: - minTrace = 3.5 - self.combo_min_trace_width_clearance.SetSelection(5) - - def set_min_hole(self, minHoleSize): - if minHoleSize == 0: - minHoleSize = 0.3 - self.combo_min_hole_size.SetSelection(0) - elif minHoleSize >= 0.3: - minHoleSize = 0.3 - self.combo_min_hole_size.SetSelection(0) - elif minHoleSize >= 0.25: - minHoleSize = 0.25 - self.combo_min_hole_size.SetSelection(1) - elif minHoleSize >= 0.2: - minHoleSize = 0.2 - self.combo_min_hole_size.SetSelection(2) - else: - minHoleSize = 0.15 - self.combo_min_hole_size.SetSelection(3) - - def OnMaskColorChange(self, event): - self.combo_silk_screen_color.Clear() - self.combo_silk_screen_color.Append( - SILK_SCREEN_COLOR_BY_SOLDER_COLOR[ - self.combo_solder_color.GetStringSelection() - ] - ) - self.combo_silk_screen_color.SetSelection(0) - - def on_region_changed(self): - pass - - def setup_trace_and_via(self): - - designSettings = self.board_manager.board.GetDesignSettings() - minTraceWidth = ( - designSettings.m_TrackMinWidth - if designSettings.m_TrackMinWidth != 0 - else None - ) - minTraceClearance = designSettings.m_MinClearance - minHoleSize = ( - designSettings.m_MinThroughDrill - if designSettings.m_MinThroughDrill != 0 - else None - ) - - tracks: "list[PCB_TRACK]" = self.board_manager.board.Tracks() - for i in tracks: - type_id = i.Type() - if type_id in (PCB_TRACE_T, PCB_ARC_T): - if minTraceWidth is None: - minTraceWidth = i.GetWidth() - continue - minTraceWidth = min(minTraceWidth, i.GetWidth()) - elif type_id == PCB_VIA_T: - if minHoleSize is None: - minHoleSize = i.GetDrillValue() - continue - minHoleSize = min(minHoleSize, i.GetDrillValue()) - - self.set_min_trace( - pcbnew.ToMils(minTraceWidth), pcbnew.ToMils(minTraceClearance) - ) - self.set_min_hole(pcbnew.ToMM(minHoleSize)) diff --git a/kicad_amf_plugin/pcb_fabrication/process/ui_process_info.fbp b/kicad_amf_plugin/pcb_fabrication/process/ui_process_info.fbp deleted file mode 100644 index df1d642..0000000 --- a/kicad_amf_plugin/pcb_fabrication/process/ui_process_info.fbp +++ /dev/null @@ -1,1413 +0,0 @@ - - - - - ; - Python - 1 - source_name - 0 - 0 - res - UTF-8 - connect - ui_process_info - 1000 - none - - - 1 - UiProcessInfo - - . - - 1 - 1 - 1 - 1 - UI - 0 - 0 - 0 - - 0 - wxAUI_MGR_DEFAULT - - - 1 - 1 - impl_virtual - - - 0 - wxID_ANY - - - UiProcessInfo - - -1,-1 - ; ; forward_declare - - 0 - - - wxTAB_TRAVERSAL - - wxID_ANY - Process info - - labelProcessInfo - wxVERTICAL - 1 - none - - 5 - wxEXPAND - 0 - - 2 - wxBOTH - 1 - - 0 - - fgSizer25 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - PCB Thickness - 0 - - 0 - - - 0 - - 1 - label_pcb_thick - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 2 - wxBOTH - 0 - - 0 - - fgSizer26 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_board_thickness - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - mm - 0 - - 0 - - - 0 - - 1 - m_staticText41 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - FInsihed Copper weight - 0 - - 0 - - - 0 - - 1 - m_staticText401 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_outer_copper_thickness - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Inner Copper Weight - 0 - - 0 - - - 0 - - 1 - m_staticText4011 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_inner_copper_thickness - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Min Trace/Space Outer - 0 - - 0 - - - 0 - - 1 - m_staticText40111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_min_trace_width_clearance - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Min Drilled Hole - 0 - - 0 - - - 0 - - 1 - m_staticText401111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_min_hole_size - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Solder Mask Color - 0 - - 0 - - - 0 - - 1 - m_staticText4011111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_solder_color - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Silkscreen - 0 - - 0 - - - 0 - - 1 - m_staticText40111111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_silk_screen_color - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Via Process - 0 - - 0 - - - 0 - - 1 - label_stackup - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_solder_cover - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Surface Finish - 0 - - 0 - - - 0 - - 1 - m_staticText4011111111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_surface_process - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Immersion Gold Thickness - 0 - - 0 - - - 0 - - 1 - label_immersion_gold - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_gold_thickness - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - diff --git a/kicad_amf_plugin/pcb_fabrication/process/ui_process_info.py b/kicad_amf_plugin/pcb_fabrication/process/ui_process_info.py deleted file mode 100644 index 2f53dd6..0000000 --- a/kicad_amf_plugin/pcb_fabrication/process/ui_process_info.py +++ /dev/null @@ -1,308 +0,0 @@ -# -*- coding: utf-8 -*- - -########################################################################### -## Python code generated with wxFormBuilder (version 3.10.1-0-g8feb16b3) -## http://www.wxformbuilder.org/ -## -## PLEASE DO *NOT* EDIT THIS FILE! -########################################################################### - -import wx -import wx.xrc - - -########################################################################### -## Class UiProcessInfo -########################################################################### - - -class UiProcessInfo(wx.Panel): - def __init__( - self, - parent, - id=wx.ID_ANY, - pos=wx.DefaultPosition, - size=wx.Size(-1, -1), - style=wx.TAB_TRAVERSAL, - name=wx.EmptyString, - ): - wx.Panel.__init__( - self, parent, id=id, pos=pos, size=size, style=style, name=name - ) - - labelProcessInfo = wx.StaticBoxSizer( - wx.StaticBox(self, wx.ID_ANY, _("Process info")), wx.VERTICAL - ) - - fgSizer25 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer25.AddGrowableCol(1) - fgSizer25.SetFlexibleDirection(wx.BOTH) - fgSizer25.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - self.label_pcb_thick = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("PCB Thickness"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.label_pcb_thick.Wrap(-1) - - fgSizer25.Add(self.label_pcb_thick, 0, wx.ALL, 5) - - fgSizer26 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer26.AddGrowableCol(0) - fgSizer26.SetFlexibleDirection(wx.BOTH) - fgSizer26.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - combo_board_thicknessChoices = [] - self.combo_board_thickness = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_board_thicknessChoices, - 0, - ) - self.combo_board_thickness.SetSelection(0) - fgSizer26.Add(self.combo_board_thickness, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText41 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("mm"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText41.Wrap(-1) - - fgSizer26.Add(self.m_staticText41, 0, wx.ALL, 5) - - fgSizer25.Add(fgSizer26, 1, wx.EXPAND, 5) - - self.m_staticText401 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("FInsihed Copper weight"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText401.Wrap(-1) - - fgSizer25.Add(self.m_staticText401, 0, wx.ALL, 5) - - combo_outer_copper_thicknessChoices = [] - self.combo_outer_copper_thickness = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_outer_copper_thicknessChoices, - 0, - ) - self.combo_outer_copper_thickness.SetSelection(0) - fgSizer25.Add(self.combo_outer_copper_thickness, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText4011 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Inner Copper Weight"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText4011.Wrap(-1) - - fgSizer25.Add(self.m_staticText4011, 0, wx.ALL, 5) - - combo_inner_copper_thicknessChoices = [] - self.combo_inner_copper_thickness = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_inner_copper_thicknessChoices, - 0, - ) - self.combo_inner_copper_thickness.SetSelection(0) - fgSizer25.Add(self.combo_inner_copper_thickness, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText40111 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Min Trace/Space Outer"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText40111.Wrap(-1) - - fgSizer25.Add(self.m_staticText40111, 0, wx.ALL, 5) - - combo_min_trace_width_clearanceChoices = [] - self.combo_min_trace_width_clearance = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_min_trace_width_clearanceChoices, - 0, - ) - self.combo_min_trace_width_clearance.SetSelection(0) - fgSizer25.Add(self.combo_min_trace_width_clearance, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText401111 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Min Drilled Hole"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText401111.Wrap(-1) - - fgSizer25.Add(self.m_staticText401111, 0, wx.ALL, 5) - - combo_min_hole_sizeChoices = [] - self.combo_min_hole_size = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_min_hole_sizeChoices, - 0, - ) - self.combo_min_hole_size.SetSelection(0) - fgSizer25.Add(self.combo_min_hole_size, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText4011111 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Solder Mask Color"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText4011111.Wrap(-1) - - fgSizer25.Add(self.m_staticText4011111, 0, wx.ALL, 5) - - combo_solder_colorChoices = [] - self.combo_solder_color = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_solder_colorChoices, - 0, - ) - self.combo_solder_color.SetSelection(0) - fgSizer25.Add(self.combo_solder_color, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText40111111 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Silkscreen"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText40111111.Wrap(-1) - - fgSizer25.Add(self.m_staticText40111111, 0, wx.ALL, 5) - - combo_silk_screen_colorChoices = [] - self.combo_silk_screen_color = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_silk_screen_colorChoices, - 0, - ) - self.combo_silk_screen_color.SetSelection(0) - fgSizer25.Add(self.combo_silk_screen_color, 0, wx.ALL | wx.EXPAND, 5) - - self.label_stackup = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Via Process"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.label_stackup.Wrap(-1) - - fgSizer25.Add(self.label_stackup, 0, wx.ALL, 5) - - combo_solder_coverChoices = [] - self.combo_solder_cover = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_solder_coverChoices, - 0, - ) - self.combo_solder_cover.SetSelection(0) - fgSizer25.Add(self.combo_solder_cover, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText4011111111 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Surface Finish"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText4011111111.Wrap(-1) - - fgSizer25.Add(self.m_staticText4011111111, 0, wx.ALL, 5) - - combo_surface_processChoices = [] - self.combo_surface_process = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_surface_processChoices, - 0, - ) - self.combo_surface_process.SetSelection(0) - fgSizer25.Add(self.combo_surface_process, 0, wx.ALL | wx.EXPAND, 5) - - self.label_immersion_gold = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Immersion Gold Thickness"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.label_immersion_gold.Wrap(-1) - - fgSizer25.Add(self.label_immersion_gold, 0, wx.ALL, 5) - - combo_gold_thicknessChoices = [] - self.combo_gold_thickness = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_gold_thicknessChoices, - 0, - ) - self.combo_gold_thickness.SetSelection(0) - fgSizer25.Add(self.combo_gold_thickness, 0, wx.ALL | wx.EXPAND, 5) - - labelProcessInfo.Add(fgSizer25, 0, wx.EXPAND, 5) - - self.SetSizer(labelProcessInfo) - self.Layout() - labelProcessInfo.Fit(self) - - def __del__(self): - pass diff --git a/kicad_amf_plugin/pcb_fabrication/special_process/__init__.py b/kicad_amf_plugin/pcb_fabrication/special_process/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/pcb_fabrication/special_process/special_process_model.py b/kicad_amf_plugin/pcb_fabrication/special_process/special_process_model.py deleted file mode 100644 index 74e2ed5..0000000 --- a/kicad_amf_plugin/pcb_fabrication/special_process/special_process_model.py +++ /dev/null @@ -1,15 +0,0 @@ -from dataclasses import dataclass - - -@dataclass -class SpecialProcessModel: - impendance: str # Impendance - bankong: str # Plated Half Holes: - blind: str # HDI(Buried/blind vias): - via_in_pad: str # Pad Hole: - beveledge: str # Beveling of G/F: - pressing: str = "" # Stack up - - baobian: str = None # 包边,默认 0 无 1-4 边 - bga: str = None # BGA,默认0 无,可选值 0.35 – 0.35及以上 0.25 #CN only - zknum: str = None # 钻孔密度 diff --git a/kicad_amf_plugin/pcb_fabrication/special_process/special_process_view.py b/kicad_amf_plugin/pcb_fabrication/special_process/special_process_view.py deleted file mode 100644 index e2c4ffc..0000000 --- a/kicad_amf_plugin/pcb_fabrication/special_process/special_process_view.py +++ /dev/null @@ -1,104 +0,0 @@ -from kicad_amf_plugin.kicad.board_manager import BoardManager -from kicad_amf_plugin.order.order_region import SupportedRegion -from kicad_amf_plugin.settings.setting_manager import SETTING_MANAGER -from kicad_amf_plugin.settings.form_value_fitter import fitter_and_map_form_value -from .ui_special_process import UiSpecialProcess -from .special_process_model import SpecialProcessModel -import wx -import wx.xrc -import wx.dataview -from kicad_amf_plugin.utils.constraint import BOOLEAN_CHOICE -from .special_process_model import SpecialProcessModel -from kicad_amf_plugin.utils.form_panel_base import FormKind, FormPanelBase - -HDI_STRUCTURE_CHOICE = [_("N/A"), _("Rank 1"), _("Rank 2"), _("Rank 3")] - -STACKUP_CHOICE = [_("No Requirement"), _("Customer Specified Stack up")] - - -class SpecialProcessView(UiSpecialProcess, FormPanelBase): - def __init__(self, parent, board_manager: BoardManager): - super().__init__(parent) - self.board_manager = board_manager - - self.combo_blind_via.Enabled = ( - self.board_manager.board.GetCopperLayerCount() != 2 - ) - self.combo_blind_via.Bind(wx.EVT_CHOICE, self.on_HDI_changed) - - def is_valid(self) -> bool: - return True - - def init(self): - self.initUI() - - def initUI(self): - for ctrl in ( - self.combo_impedance, - self.combo_goldFinger, - self.combo_halfHole, - self.combo_pad_hole, - self.combo_blind_via, - ): - for i in BOOLEAN_CHOICE: - ctrl.Append(_(i)) - ctrl.SetSelection(0) - - self.combo_hdi_structure.Append(HDI_STRUCTURE_CHOICE) - self.combo_hdi_structure.SetSelection(0) - - self.combo_stackup.Append(STACKUP_CHOICE) - self.combo_stackup.SetSelection(0) - self.combo_hdi_structure.Enabled = False - self.combo_baobian.Append([str(i) for i in range(0, 5)]) - self.combo_baobian.SetSelection(0) - - @fitter_and_map_form_value - def get_from(self, kind: FormKind) -> "dict": - info = SpecialProcessModel( - impendance=str(self.combo_impedance.GetSelection()), - bankong=str(self.combo_halfHole.GetSelection()), - blind=self.GetBlindValue(), - via_in_pad="N/A" if self.combo_pad_hole.GetSelection() == 0 else "Have", - beveledge=str(self.combo_goldFinger.GetSelection()), - baobian=self.combo_baobian.GetStringSelection(), - ) - if ( - self.combo_stackup.Shown - and self.layer_count > 2 - and self.combo_stackup.GetSelection() != 0 - ): - info.pressing = "Customer Specified Stack up" - return vars(info) - - @property - def layer_count(self): - return self.board_manager.board.GetCopperLayerCount() - - def on_HDI_changed(self, event): - self.combo_hdi_structure.Enabled = self.combo_blind_via.GetSelection() == 1 - if not self.combo_hdi_structure.Enabled: - self.combo_hdi_structure.SetSelection(0) - - def on_layer_count_changed(self, event): - self.combo_blind_via.Enabled = event.GetInt() > 2 - if not self.combo_blind_via.Enabled: - self.combo_blind_via.SetSelection(0) - self.combo_hdi_structure.Enabled = False - - def GetBlindValue(self): - if ( - self.combo_blind_via.GetSelection() == 0 - or self.combo_hdi_structure.GetSelection() == 0 - ): - return "0" - elif self.combo_hdi_structure.GetSelection() == 1: - return "1" - elif self.combo_hdi_structure.GetSelection() == 2: - return "2" - elif self.combo_hdi_structure.GetSelection() == 3: - return "3" - - def on_region_changed(self): - for i in self.label_stackup, self.combo_stackup: - i.Show(SETTING_MANAGER.order_region != SupportedRegion.CHINA_MAINLAND) diff --git a/kicad_amf_plugin/pcb_fabrication/special_process/ui_special_process.fbp b/kicad_amf_plugin/pcb_fabrication/special_process/ui_special_process.fbp deleted file mode 100644 index 2c1a769..0000000 --- a/kicad_amf_plugin/pcb_fabrication/special_process/ui_special_process.fbp +++ /dev/null @@ -1,1084 +0,0 @@ - - - - - ; - Python - 1 - source_name - 0 - 0 - res - UTF-8 - connect - ui_special_process - 1000 - none - - - 1 - UiSpecialProcess - - . - - 1 - 1 - 1 - 1 - UI - 0 - 0 - 0 - - 0 - wxAUI_MGR_DEFAULT - - - 1 - 1 - impl_virtual - - - 0 - wxID_ANY - - - UiSpecialProcess - - -1,-1 - ; ; forward_declare - - 0 - - - wxTAB_TRAVERSAL - - wxID_ANY - Special Process - - labelProcessInfo - wxVERTICAL - 1 - none - - 5 - wxEXPAND - 0 - - 2 - wxBOTH - 1 - - 0 - - fgSizer25 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Impedance - 0 - - 0 - - - 0 - - 1 - m_staticText401 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_impedance - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Beveling of G/F - 0 - - 0 - - - 0 - - 1 - m_staticText4011 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_goldFinger - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Plated Half Holes - 0 - - 0 - - - 0 - - 1 - m_staticText40111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_halfHole - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Pad Hole - 0 - - 0 - - - 0 - - 1 - m_staticText401111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_pad_hole - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - HDI(Buried/blind vais) - 0 - - 0 - - - 0 - - 1 - m_staticText4011111 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_blind_via - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - HDI Structure - 0 - - 0 - - - 0 - - 1 - label_hdi - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_hdi_structure - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Stack up - 0 - - 0 - - - 0 - - 1 - label_stackup - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_stackup - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Metallized Sides Count - 0 - - 0 - - - 0 - - 1 - m_staticText8 - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - combo_baobian - 1 - - - protected - 1 - - Resizable - 0 - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - diff --git a/kicad_amf_plugin/pcb_fabrication/special_process/ui_special_process.py b/kicad_amf_plugin/pcb_fabrication/special_process/ui_special_process.py deleted file mode 100644 index 73fbb13..0000000 --- a/kicad_amf_plugin/pcb_fabrication/special_process/ui_special_process.py +++ /dev/null @@ -1,241 +0,0 @@ -# -*- coding: utf-8 -*- - -########################################################################### -## Python code generated with wxFormBuilder (version 3.10.1-0-g8feb16b3) -## http://www.wxformbuilder.org/ -## -## PLEASE DO *NOT* EDIT THIS FILE! -########################################################################### - -import wx -import wx.xrc - - -########################################################################### -## Class UiSpecialProcess -########################################################################### - - -class UiSpecialProcess(wx.Panel): - def __init__( - self, - parent, - id=wx.ID_ANY, - pos=wx.DefaultPosition, - size=wx.Size(-1, -1), - style=wx.TAB_TRAVERSAL, - name=wx.EmptyString, - ): - wx.Panel.__init__( - self, parent, id=id, pos=pos, size=size, style=style, name=name - ) - - labelProcessInfo = wx.StaticBoxSizer( - wx.StaticBox(self, wx.ID_ANY, _("Special Process")), wx.VERTICAL - ) - - fgSizer25 = wx.FlexGridSizer(0, 2, 0, 0) - fgSizer25.AddGrowableCol(1) - fgSizer25.SetFlexibleDirection(wx.BOTH) - fgSizer25.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED) - - self.m_staticText401 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Impedance"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText401.Wrap(-1) - - fgSizer25.Add(self.m_staticText401, 0, wx.ALL, 5) - - combo_impedanceChoices = [] - self.combo_impedance = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_impedanceChoices, - 0, - ) - self.combo_impedance.SetSelection(0) - fgSizer25.Add(self.combo_impedance, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText4011 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Beveling of G/F"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText4011.Wrap(-1) - - fgSizer25.Add(self.m_staticText4011, 0, wx.ALL, 5) - - combo_goldFingerChoices = [] - self.combo_goldFinger = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_goldFingerChoices, - 0, - ) - self.combo_goldFinger.SetSelection(0) - fgSizer25.Add(self.combo_goldFinger, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText40111 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Plated Half Holes"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText40111.Wrap(-1) - - fgSizer25.Add(self.m_staticText40111, 0, wx.ALL, 5) - - combo_halfHoleChoices = [] - self.combo_halfHole = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_halfHoleChoices, - 0, - ) - self.combo_halfHole.SetSelection(0) - fgSizer25.Add(self.combo_halfHole, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText401111 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Pad Hole"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText401111.Wrap(-1) - - fgSizer25.Add(self.m_staticText401111, 0, wx.ALL, 5) - - combo_pad_holeChoices = [] - self.combo_pad_hole = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_pad_holeChoices, - 0, - ) - self.combo_pad_hole.SetSelection(0) - fgSizer25.Add(self.combo_pad_hole, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText4011111 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("HDI(Buried/blind vais)"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText4011111.Wrap(-1) - - fgSizer25.Add(self.m_staticText4011111, 0, wx.ALL, 5) - - combo_blind_viaChoices = [] - self.combo_blind_via = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_blind_viaChoices, - 0, - ) - self.combo_blind_via.SetSelection(0) - fgSizer25.Add(self.combo_blind_via, 0, wx.ALL | wx.EXPAND, 5) - - self.label_hdi = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("HDI Structure"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.label_hdi.Wrap(-1) - - fgSizer25.Add(self.label_hdi, 0, wx.ALL, 5) - - combo_hdi_structureChoices = [] - self.combo_hdi_structure = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_hdi_structureChoices, - 0, - ) - self.combo_hdi_structure.SetSelection(0) - fgSizer25.Add(self.combo_hdi_structure, 0, wx.ALL | wx.EXPAND, 5) - - self.label_stackup = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Stack up"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.label_stackup.Wrap(-1) - - fgSizer25.Add(self.label_stackup, 0, wx.ALL, 5) - - combo_stackupChoices = [] - self.combo_stackup = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_stackupChoices, - 0, - ) - self.combo_stackup.SetSelection(0) - fgSizer25.Add(self.combo_stackup, 0, wx.ALL | wx.EXPAND, 5) - - self.m_staticText8 = wx.StaticText( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - _("Metallized Sides Count"), - wx.DefaultPosition, - wx.DefaultSize, - 0, - ) - self.m_staticText8.Wrap(-1) - - fgSizer25.Add(self.m_staticText8, 0, wx.ALL, 5) - - combo_baobianChoices = [] - self.combo_baobian = wx.Choice( - labelProcessInfo.GetStaticBox(), - wx.ID_ANY, - wx.DefaultPosition, - wx.DefaultSize, - combo_baobianChoices, - 0, - ) - self.combo_baobian.SetSelection(0) - fgSizer25.Add(self.combo_baobian, 0, wx.ALL | wx.EXPAND, 5) - - labelProcessInfo.Add(fgSizer25, 0, wx.EXPAND, 5) - - self.SetSizer(labelProcessInfo) - self.Layout() - labelProcessInfo.Fit(self) - - def __del__(self): - pass diff --git a/kicad_amf_plugin/plugin/__init__.py b/kicad_amf_plugin/plugin/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/plugin/_main.py b/kicad_amf_plugin/plugin/_main.py deleted file mode 100644 index 551dc07..0000000 --- a/kicad_amf_plugin/plugin/_main.py +++ /dev/null @@ -1,9 +0,0 @@ -from kicad_amf_plugin.settings.single_plugin import SINGLE_PLUGIN - - -def _main(): - if not SINGLE_PLUGIN.show_existing(): - from kicad_amf_plugin.gui.app_base import BaseApp - - app = BaseApp() - app.MainLoop() diff --git a/kicad_amf_plugin/settings/__init__.py b/kicad_amf_plugin/settings/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/settings/default_express.py b/kicad_amf_plugin/settings/default_express.py deleted file mode 100644 index 435112c..0000000 --- a/kicad_amf_plugin/settings/default_express.py +++ /dev/null @@ -1 +0,0 @@ -DEFAULT_EXPRESS = {"address": "广东省深圳市", "express": "顺丰快递"} diff --git a/kicad_amf_plugin/settings/form_value_fitter.py b/kicad_amf_plugin/settings/form_value_fitter.py deleted file mode 100644 index 1521932..0000000 --- a/kicad_amf_plugin/settings/form_value_fitter.py +++ /dev/null @@ -1,43 +0,0 @@ -from kicad_amf_plugin.order.supported_region import SupportedRegion -from .setting_manager import SETTING_MANAGER - -MAPPING = { - "N/A": "无", - "Left & Right": "左右", - "Top & Bottom": "上下", - "All 4 sides": "四边", - "Green": "绿色", - "Red": "红色", - "Yellow": "黄色", - "Blue": "蓝色", - "White": "白色", - "Matte Black": "哑黑", - "Black": "黑色", - "Solder Mask Plug (IV-B)": "过孔塞油墨", - "Tenting Vias": "过孔盖油", - "Vias not covered": "过孔开窗", - "Non-Conductive Fill & Cap (VII)": "过孔塞树脂+电镀填平", - "HASL": "有铅喷锡", - "Lead free HASL": "无铅喷锡", - "ENIG": "沉金", - "Have": "有", -} - - -def fitter_and_map_form_value(fn): - def wrapper(*args, **kwargs): - form: "dict" = fn(*args, **kwargs) - new_form = {} - for i in form: - if form[i] is None: - continue - if ( - SETTING_MANAGER.order_region == SupportedRegion.CHINA_MAINLAND - and form[i] in MAPPING - ): - new_form[i] = MAPPING[form[i]] - else: - new_form[i] = form[i] - return new_form - - return wrapper diff --git a/kicad_amf_plugin/settings/kicad_setting.py b/kicad_amf_plugin/settings/kicad_setting.py deleted file mode 100644 index 293ed57..0000000 --- a/kicad_amf_plugin/settings/kicad_setting.py +++ /dev/null @@ -1,31 +0,0 @@ -import json - -import wx -import os -import logging - - -class KiCadSetting: - def read_lang_setting(): - try: - import pcbnew - - kicad_setting_path = str(pcbnew.SETTINGS_MANAGER.GetUserSettingsPath()) - logging.info(f"Kicad setting path {kicad_setting_path}") - print(f"Kicad setting path {kicad_setting_path}") - if len(kicad_setting_path): - kicad_common_json = os.path.join( - kicad_setting_path, "kicad_common.json" - ) - with open(kicad_common_json) as f: - data = json.loads(f.read()) - lang: str = data["system"]["language"] - if lang.count("中文"): - return wx.LANGUAGE_CHINESE_SIMPLIFIED - elif lang.count("日本"): - return wx.LANGUAGE_JAPANESE_JAPAN - else: - logging.error("Empty KiCad config path!") - except: - logging.error("Cannot read the language setting of KiCad!") - return wx.LANGUAGE_ENGLISH diff --git a/kicad_amf_plugin/settings/setting_manager.py b/kicad_amf_plugin/settings/setting_manager.py deleted file mode 100644 index fcc2f8b..0000000 --- a/kicad_amf_plugin/settings/setting_manager.py +++ /dev/null @@ -1,109 +0,0 @@ -import wx -import os -from kicad_amf_plugin.gui.event.pcb_fabrication_evt_list import LocaleChangeEvent -from .kicad_setting import KiCadSetting -from kicad_amf_plugin.order.supported_region import SupportedRegion -from kicad_amf_plugin.utils.public_ip import get_ip_country - -APP_NAME = "kicad_amf_plugin" - -VENDOR_NAME = "NextPCB" - -LANGUAGE = "language" - -ORDER_REGION = "order_region" - -WIDTH = "width" - -HEIGHT = "height" - -PRICE_UNIT = {0: "¥", 1: "$"} - -TRANSLATED_PRICE_UNIT = {"¥": "元", "$": "美元"} - - -CN_JP_BUILD_TIME_FORMATTER = "{time}{unit}" - -EN_BUILD_TIME_FORMATTER = "{time} {unit}" - - -class _SettingManager(wx.EvtHandler): - def __init__(self) -> None: - self.app: wx.App = None - sp = wx.StandardPaths.Get() - config_loc = sp.GetUserConfigDir() - config_loc = os.path.join(config_loc, APP_NAME) - - if not os.path.exists(config_loc): - os.mkdir(config_loc) - - self.app_conf = wx.FileConfig( - appName=APP_NAME, - vendorName=VENDOR_NAME, - localFilename=os.path.join(config_loc, "common.ini"), - ) - - if not self.app_conf.HasEntry(LANGUAGE): - self.set_language(KiCadSetting.read_lang_setting()) - self.app_conf.Flush() - if not self.app_conf.HasEntry(WIDTH) or not self.app_conf.HasEntry(HEIGHT): - self.set_window_size((660, 700)) - if not self.app_conf.HasEntry(ORDER_REGION): - location = get_ip_country() - if location == "China": - self.set_order_region(SupportedRegion.CHINA_MAINLAND) - elif location == "Japan": - self.set_order_region(SupportedRegion.JAPAN) - else: - self.set_order_region(SupportedRegion.EUROPE_USA) - - def register_app(self, app: wx.App): - self.app = app - - def set_language(self, now: int): - old = self.language - if old == now: - return - self.app_conf.WriteInt(key=LANGUAGE, value=now) - if self.app: - evt = LocaleChangeEvent(id=-1) - evt.SetInt(now) - self.app_conf.Flush() - wx.PostEvent(self.app, evt) - - @property - def language(self): - return self.app_conf.ReadInt(LANGUAGE) - - def set_order_region(self, region: int): - self.app_conf.WriteInt(key=ORDER_REGION, value=region) - - @property - def order_region(self): - return self.app_conf.ReadInt(ORDER_REGION) - - def get_price_unit(self, translated=False): - sym = "¥" if not self.order_region else "$" - if not translated: - return sym - if self.language == wx.LANGUAGE_CHINESE_SIMPLIFIED: - return TRANSLATED_PRICE_UNIT[sym] - return sym - - def get_build_time_formatter(self): - return ( - EN_BUILD_TIME_FORMATTER - if SupportedRegion.EUROPE_USA == self.order_region - else CN_JP_BUILD_TIME_FORMATTER - ) - - def set_window_size(self, s: "tuple[int,int]"): - self.app_conf.WriteInt(key=WIDTH, value=s[0]) - self.app_conf.WriteInt(key=HEIGHT, value=s[1]) - self.app_conf.Flush() - - def get_window_size(self): - return wx.Size(self.app_conf.ReadInt(WIDTH), self.app_conf.ReadInt(HEIGHT)) - - -SETTING_MANAGER = _SettingManager() diff --git a/kicad_amf_plugin/settings/single_plugin.py b/kicad_amf_plugin/settings/single_plugin.py deleted file mode 100644 index bb6535e..0000000 --- a/kicad_amf_plugin/settings/single_plugin.py +++ /dev/null @@ -1,23 +0,0 @@ -import wx - - -class _SinglePlugin: - def __init__(self) -> None: - self.app: wx.App = None - self.wind: wx.TopLevelWindow = None - - def register_main_wind(self, wind: wx.TopLevelWindow): - self.wind = wind - - def get_main_wind(self): - return self.wind - - def show_existing(self): - if not self.wind is None: - self.wind.Show(False) - self.wind.Show(True) - return True - return False - - -SINGLE_PLUGIN = _SinglePlugin() diff --git a/kicad_amf_plugin/settings/supported_layer_count.py b/kicad_amf_plugin/settings/supported_layer_count.py deleted file mode 100644 index 59df4d2..0000000 --- a/kicad_amf_plugin/settings/supported_layer_count.py +++ /dev/null @@ -1 +0,0 @@ -AVAILABLE_LAYER_COUNTS = [1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] diff --git a/kicad_amf_plugin/utils/__init__.py b/kicad_amf_plugin/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/kicad_amf_plugin/utils/combo_box_ignore_wheel.py b/kicad_amf_plugin/utils/combo_box_ignore_wheel.py deleted file mode 100644 index a9b5bf6..0000000 --- a/kicad_amf_plugin/utils/combo_box_ignore_wheel.py +++ /dev/null @@ -1,23 +0,0 @@ -import wx - - -class ComboBoxIgnoreWheel(wx.Choice): - def __init__(self, *args, **kw): - super().__init__(*args, **kw) - self.wheel_evt_handle = None - self.parent_can_hand_wheel = True - - def ProcessEvent(self, evt: wx.Event): - if evt.EventType == wx.wxEVT_MOUSEWHEEL: - if self.parent_can_hand_wheel and self.wheel_evt_handle is not None: - self.wheel_evt_handle.HandleWindowEvent(evt) - if not self.wheel_evt_handle: - p = self.Parent - while p: - if p.HandleWindowEvent(evt): - self.wheel_evt_handle = p - return True - p = p.Parent - self.parent_can_hand_wheel = False - return True - return super().ProcessEvent(evt) diff --git a/kicad_amf_plugin/utils/constraint.py b/kicad_amf_plugin/utils/constraint.py deleted file mode 100644 index f02b4d1..0000000 --- a/kicad_amf_plugin/utils/constraint.py +++ /dev/null @@ -1,6 +0,0 @@ -import wx - -_ = wx.GetTranslation - - -BOOLEAN_CHOICE = [_("No"), _("Yes")] diff --git a/kicad_amf_plugin/utils/form_panel_base.py b/kicad_amf_plugin/utils/form_panel_base.py deleted file mode 100644 index 12b76f0..0000000 --- a/kicad_amf_plugin/utils/form_panel_base.py +++ /dev/null @@ -1,42 +0,0 @@ -import abc -from enum import Enum - -from kicad_amf_plugin.order.supported_region import SupportedRegion -from .number_round import number_round - - -class FormKind(Enum): - QUERY_PRICE = 0 - PLACE_ORDER = 1 - - -class FormPanelBase: - def init(self) -> "None": - pass - - def is_valid(self) -> bool: - return True - - @abc.abstractclassmethod - def get_from(self, kind: FormKind) -> "dict": - pass - - def on_region_changed(self): - pass - - @staticmethod - @number_round() - def convert_geometry(form_kind: FormKind, region: SupportedRegion, geometry: float): - """Convert the geometry (mm) to proper unit - - Args: - form_kind (FormKind): - region (SupportedRegion): - geometry (float): mm - """ - if ( - SupportedRegion.CHINA_MAINLAND != region - and FormKind.PLACE_ORDER == form_kind - ): - return geometry - return geometry / 10 diff --git a/kicad_amf_plugin/utils/number_round.py b/kicad_amf_plugin/utils/number_round.py deleted file mode 100644 index fd5c38c..0000000 --- a/kicad_amf_plugin/utils/number_round.py +++ /dev/null @@ -1,8 +0,0 @@ -def number_round(digit=2): - def decorate(fn): - def wrapper(*args, **kwargs): - return round(fn(*args, **kwargs), digit) - - return wrapper - - return decorate diff --git a/kicad_amf_plugin/utils/platebtn.py b/kicad_amf_plugin/utils/platebtn.py deleted file mode 100644 index e87327a..0000000 --- a/kicad_amf_plugin/utils/platebtn.py +++ /dev/null @@ -1,817 +0,0 @@ -############################################################################### -# Name: platebtn.py # -# Purpose: PlateButton is a flat label button with support for bitmaps and # -# drop menu. # -# Author: Cody Precord # -# Copyright: (c) 2007 Cody Precord # -# Licence: wxWindows Licence # -# Tags: phoenix-port -############################################################################### - -""" -Editra Control Library: PlateButton - -The PlateButton is a custom owner drawn flat button, that in many ways emulates -the buttons found the bookmark bar of the Safari browser. It can be used as a -drop in replacement for wx.Button/wx.BitmapButton under most circumstances. It -also offers a wide range of options for customizing its appearance, a -description of each of the main style settings is listed below. - -Main Button Styles: -Any combination of the following values may be passed to the constructor's style -keyword parameter. - -PB_STYLE_DEFAULT: -Creates a flat label button with rounded corners, the highlight for mouse over -and press states is based off of the highlight color from the systems current -theme. - -PB_STYLE_GRADIENT: -The highlight and press states are drawn with gradient using the current -highlight color. - -PB_STYLE_SQUARE: -Instead of the default rounded shape use a rectangular shaped button with -square edges. - -PB_STYLE_NOBG: -This style only has an effect on Windows but does not cause harm to use on the -platforms. It should only be used when the control is shown on a panel or other -window that has a non solid color for a background. i.e a gradient or image is -painted on the background of the parent window. If used on a background with -a solid color it may cause the control to loose its transparent appearance. - -PB_STYLE_DROPARROW: -Add a drop button arrow to the button that will send a separate event when -clicked on. - -Other attributes can be configured after the control has been created. The -settings that are currently available are as follows: - - - SetBitmap: Change/Add the bitmap at any time and the control will resize and - refresh to display it. - - SetLabelColor: Explicitly set text colors - - SetMenu: Set the button to have a popupmenu. When a menu is set a small drop - arrow will be drawn on the button that can then be clicked to show - a menu. - - SetPressColor: Use a custom highlight color - - -Overridden Methods Inherited from PyControl: - - - SetFont: Changing the font is one way to set the size of the button, by - default the control will inherit its font from its parent. - - - SetWindowVariant: Setting the window variant will cause the control to - resize to the corresponding variant size. However if the - button is using a bitmap the bitmap will remain unchanged - and only the font will be adjusted. - -Requirements: - - python2.4 or higher - - wxPython2.8 or higher - -""" - -__author__ = "Cody Precord " - -__all__ = [ - "PlateButton", - "PLATE_NORMAL", - "PLATE_PRESSED", - "PLATE_HIGHLIGHT", - "PB_STYLE_DEFAULT", - "PB_STYLE_GRADIENT", - "PB_STYLE_SQUARE", - "PB_STYLE_NOBG", - "PB_STYLE_DROPARROW", - "PB_STYLE_TOGGLE", - "EVT_PLATEBTN_DROPARROW_PRESSED", -] - -# -----------------------------------------------------------------------------# -# Imports -import wx -import wx.lib.newevent - -# Local Imports -from wx.lib.colourutils import * - -# -----------------------------------------------------------------------------# -# Button States -PLATE_NORMAL = 0 -PLATE_PRESSED = 1 -PLATE_HIGHLIGHT = 2 - -# Button Styles -PB_STYLE_DEFAULT = 1 # Normal Flat Background -PB_STYLE_GRADIENT = 2 # Gradient Filled Background -PB_STYLE_SQUARE = 4 # Use square corners instead of rounded -PB_STYLE_NOBG = 8 # Useful on Windows to get a transparent appearance -# when the control is shown on a non solid background -PB_STYLE_DROPARROW = 16 # Draw drop arrow and fire EVT_PLATEBTN_DROPRROW_PRESSED event -PB_STYLE_TOGGLE = 32 # Stay pressed until clicked again - -# -----------------------------------------------------------------------------# - -# EVT_BUTTON used for normal event notification -# EVT_TOGGLE_BUTTON used for toggle button mode notification -PlateBtnDropArrowPressed, EVT_PLATEBTN_DROPARROW_PRESSED = wx.lib.newevent.NewEvent() - -# -----------------------------------------------------------------------------# - - -class PlateButton(wx.Control): - """PlateButton is a custom type of flat button with support for - displaying bitmaps and having an attached dropdown menu. - - """ - - def __init__( - self, - parent, - id=wx.ID_ANY, - label="", - bmp=None, - pos=wx.DefaultPosition, - size=wx.DefaultSize, - style=PB_STYLE_DEFAULT, - name=wx.ButtonNameStr, - ): - """Create a PlateButton - - :keyword string `label`: Buttons label text - :keyword wx.Bitmap `bmp`: Buttons bitmap - :keyword `style`: Button style - - """ - super(PlateButton, self).__init__( - parent, id, pos, size, wx.BORDER_NONE | wx.TRANSPARENT_WINDOW, name=name - ) - - # Attributes - self.InheritAttributes() - self._bmp = dict(enable=None, disable=None) - if bmp is not None: - assert isinstance(bmp, wx.Bitmap) and bmp.IsOk() - self._bmp["enable"] = bmp - img = bmp.ConvertToImage() - img = img.ConvertToGreyscale(0.795, 0.073, 0.026) # (.634, .224, .143) - self._bmp["disable"] = wx.Bitmap(img) - - self._menu = None - self.SetLabel(label) - self._style = style - self._state = dict(pre=PLATE_NORMAL, cur=PLATE_NORMAL) - self._color = self.__InitColors() - self._pressed = False - - # Setup Initial Size - self.SetInitialSize(size) - - # Event Handlers - self.Bind(wx.EVT_PAINT, lambda evt: self.__DrawButton()) - self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnErase) - self.Bind(wx.EVT_SET_FOCUS, self.OnFocus) - self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus) - - # Mouse Events - self.Bind(wx.EVT_LEFT_DCLICK, lambda evt: self._ToggleState()) - self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) - self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) - self.Bind(wx.EVT_ENTER_WINDOW, lambda evt: self._SetState(PLATE_HIGHLIGHT)) - self.Bind(wx.EVT_LEAVE_WINDOW, lambda evt: wx.CallLater(80, self.__LeaveWindow)) - - # Other events - self.Bind(wx.EVT_KEY_UP, self.OnKeyUp) - self.Bind(wx.EVT_CONTEXT_MENU, lambda evt: self.ShowMenu()) - - def __DrawBitmap(self, gc): - """Draw the bitmap if one has been set - - :param wx.GCDC `gc`: :class:`wx.GCDC` to draw with - :return: x coordinate to draw text at - - """ - - tw, _ = gc.GetTextExtent(self.Label) - width, height = self.GetSize() - if self.IsEnabled(): - bmp = self._bmp["enable"] - else: - bmp = self._bmp["disable"] - - if bmp is not None and bmp.IsOk(): - bw, bh = bmp.GetSize() - ypos = (self.GetSize()[1] - bh) // 2 - if tw > 0: - gc.DrawBitmap( - bmp, (width - tw) // 2 - bw - 6, ypos, bmp.GetMask() is not None - ) - else: - gc.DrawBitmap(bmp, 6, ypos, bmp.GetMask() is not None) - - def __DrawDropArrow(self, gc, xpos, ypos): - """Draw a drop arrow if needed and restore pen/brush after finished - - :param wx.GCDC `gc`: :class:`wx.GCDC` to draw with - :param int `xpos`: x cord to start at - :param int `ypos`: y cord to start at - - """ - if self._menu is not None or self._style & PB_STYLE_DROPARROW: - # Positioning needs a little help on Windows - if wx.Platform == "__WXMSW__": - xpos -= 2 - tripoints = [(xpos, ypos), (xpos + 6, ypos), (xpos + 3, ypos + 5)] - brush_b = gc.GetBrush() - pen_b = gc.GetPen() - gc.SetPen(wx.TRANSPARENT_PEN) - gc.SetBrush(wx.Brush(gc.GetTextForeground())) - gc.DrawPolygon(tripoints) - gc.SetBrush(brush_b) - gc.SetPen(pen_b) - else: - pass - - def __DrawHighlight(self, gc, width, height): - """Draw the main highlight/pressed state - - :param wx.GCDC `gc`: :class:`wx.GCDC` to draw with - :param int `width`: width of highlight - :param int `height`: height of highlight - - """ - if self._state["cur"] == PLATE_PRESSED: - color = self._color["press"] - else: - color = self._color["hlight"] - - if self._style & PB_STYLE_SQUARE: - rad = 0 - else: - rad = (height - 3) // 2 - - if self._style & PB_STYLE_GRADIENT: - gc.SetBrush(wx.TRANSPARENT_BRUSH) - rgc = gc.GetGraphicsContext() - brush = rgc.CreateLinearGradientBrush( - 0, 1, 0, height, color, AdjustAlpha(color, 55) - ) - rgc.SetBrush(brush) - else: - gc.SetBrush(wx.Brush(color)) - - gc.DrawRoundedRectangle(1, 1, width - 2, height - 2, rad) - - def __DrawNormal(self, gc, width, height): - """Draw the main highlight/pressed state - - :param wx.GCDC `gc`: :class:`wx.GCDC` to draw with - :param int `width`: width of highlight - :param int `height`: height of highlight - - """ - # if self._state['cur'] == PLATE_PRESSED: - # color = self._color['press'] - # else: - # color = self._color['hlight'] - - color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_MENUBAR) - - if self._style & PB_STYLE_SQUARE: - rad = 0 - else: - rad = (height - 3) // 2 - - if self._style & PB_STYLE_GRADIENT: - gc.SetBrush(wx.TRANSPARENT_BRUSH) - rgc = gc.GetGraphicsContext() - brush = rgc.CreateLinearGradientBrush( - 0, 1, 0, height, color, AdjustAlpha(color, 55) - ) - rgc.SetBrush(brush) - else: - gc.SetBrush(wx.Brush(color)) - - gc.DrawRoundedRectangle(1, 1, width - 2, height - 2, rad) - - def __PostEvent(self): - """Post a button event to parent of this control""" - if self._style & PB_STYLE_TOGGLE: - etype = wx.wxEVT_COMMAND_TOGGLEBUTTON_CLICKED - else: - etype = wx.wxEVT_COMMAND_BUTTON_CLICKED - bevt = wx.CommandEvent(etype, self.GetId()) - bevt.SetEventObject(self) - bevt.SetString(self.GetLabel()) - self.GetEventHandler().ProcessEvent(bevt) - - def __DrawButton(self): - """Draw the button""" - # TODO using a buffered paintdc on windows with the nobg style - # causes lots of weird drawing. So currently the use of a - # buffered dc is disabled for this style. - if PB_STYLE_NOBG & self._style: - dc = wx.PaintDC(self) - else: - dc = wx.AutoBufferedPaintDCFactory(self) - - gc = wx.GCDC(dc) - - # Setup - dc.SetBrush(wx.TRANSPARENT_BRUSH) - gc.SetBrush(wx.TRANSPARENT_BRUSH) - gc.SetFont(self.Font) - dc.SetFont(self.Font) - gc.SetBackgroundMode(wx.TRANSPARENT) - - # The background needs some help to look transparent on - # on Gtk and Windows - if wx.Platform in ["__WXGTK__", "__WXMSW__"]: - gc.SetBackground(self.GetBackgroundBrush(gc)) - gc.Clear() - - # Calc Object Positions - width, height = self.GetSize() - if wx.Platform == "__WXGTK__": - tw, th = dc.GetTextExtent(self.Label) - else: - tw, th = gc.GetTextExtent(self.Label) - txt_y = max((height - th) // 2, 1) - - if self._state["cur"] == PLATE_HIGHLIGHT: - gc.SetTextForeground(self._color["htxt"]) - gc.SetPen(wx.TRANSPARENT_PEN) - self.__DrawHighlight(gc, width, height) - - elif self._state["cur"] == PLATE_PRESSED: - gc.SetTextForeground(self._color["htxt"]) - if wx.Platform == "__WXMAC__": - pen = wx.Pen(GetHighlightColour(), 1, wx.PENSTYLE_SOLID) - else: - pen = wx.Pen(AdjustColour(self._color["press"], -80, 220), 1) - gc.SetPen(pen) - - self.__DrawHighlight(gc, width, height) - self.__DrawBitmap(gc) - # if wx.Platform == '__WXGTK__': - # dc.DrawText(self.Label, txt_x + 2, txt_y) - # else: - # gc.DrawText(self.Label, txt_x + 2, txt_y) - if wx.Platform == "__WXGTK__": - dc.DrawText(self.Label, (width - tw) // 2, txt_y) - else: - gc.DrawText(self.Label, (width - tw) // 2, txt_y) - self.__DrawDropArrow(gc, width - 10, (height // 2) - 2) - - else: - if self.IsEnabled(): - gc.SetTextForeground(self.GetForegroundColour()) - else: - txt_c = wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT) - gc.SetTextForeground(txt_c) - self.__DrawNormal(gc, width, height) - - # Draw bitmap and text - if self._state["cur"] != PLATE_PRESSED: - self.__DrawBitmap(gc) - # if wx.Platform == '__WXGTK__': - # dc.DrawText(self.Label, txt_x + 2, txt_y) - # else: - # gc.DrawText(self.Label, txt_x + 2, txt_y) - if wx.Platform == "__WXGTK__": - dc.DrawText(self.Label, (width - tw) // 2, txt_y) - else: - gc.DrawText(self.Label, (width - tw) // 2, txt_y) - self.__DrawDropArrow(gc, width - 10, (height // 2) - 2) - - def __InitColors(self): - """Initialize the default colors""" - color = GetHighlightColour() - pcolor = AdjustColour(color, -12) - colors = dict( - default=True, - hlight=color, - press=pcolor, - htxt=BestLabelColour(self.GetForegroundColour()), - ) - return colors - - def __LeaveWindow(self): - """Handle updating the buttons state when the mouse cursor leaves""" - if (self._style & PB_STYLE_TOGGLE) and self._pressed: - self._SetState(PLATE_PRESSED) - else: - self._SetState(PLATE_NORMAL) - self._pressed = False - - def _SetState(self, state): - """Manually set the state of the button - - :param `state`: one of the PLATE_* values - - .. note:: - the state may be altered by mouse actions - - .. note:: - Internal use only! - - """ - self._state["pre"] = self._state["cur"] - self._state["cur"] = state - if wx.Platform == "__WXMSW__": - self.Parent.RefreshRect(self.Rect, False) - else: - self.Refresh() - - def _ToggleState(self): - """Toggle button state - - ..note:: - Internal Use Only! - - """ - if self._state["cur"] != PLATE_PRESSED: - self._SetState(PLATE_PRESSED) - else: - self._SetState(PLATE_HIGHLIGHT) - - # ---- End Private Member Function ----# - - # ---- Public Member Functions ----# - - BitmapDisabled = property( - lambda self: self.GetBitmapDisabled(), - lambda self, bmp: self.SetBitmapDisabled(bmp), - ) - BitmapLabel = property( - lambda self: self.GetBitmapLabel(), lambda self, bmp: self.SetBitmap(bmp) - ) - - # Aliases - BitmapFocus = BitmapLabel - BitmapHover = BitmapLabel - BitmapSelected = BitmapLabel - - LabelText = property( - lambda self: self.GetLabel(), lambda self, lbl: self.SetLabel(lbl) - ) - - def AcceptsFocus(self): - """Can this window have the focus?""" - return self.IsEnabled() - - def Disable(self): - """Disable the control""" - super(PlateButton, self).Disable() - self.Refresh() - - def DoGetBestSize(self): - """Calculate the best size of the button - - :return: :class:`wx.Size` - - """ - width = 4 - height = 6 - if self.Label: - # NOTE: Should measure with a GraphicsContext to get right - # size, but due to random segfaults on linux special - # handling is done in the drawing instead... - lsize = self.GetFullTextExtent(self.Label) - width += lsize[0] - height += lsize[1] - - if self._bmp["enable"] is not None: - bsize = self._bmp["enable"].Size - width += bsize[0] + 10 - if height <= bsize[1]: - height = bsize[1] + 6 - else: - height += 3 - else: - width += 10 - - if self._menu is not None or self._style & PB_STYLE_DROPARROW: - width += 12 - - best = wx.Size(width, height) - self.CacheBestSize(best) - return best - - def Enable(self, enable=True): - """Enable/Disable the control""" - super(PlateButton, self).Enable(enable) - self.Refresh() - - def GetBackgroundBrush(self, dc): - """Get the brush for drawing the background of the button - - :return: :class:`wx.Brush` - - ..note:: - used internally when on gtk - - """ - if wx.Platform == "__WXMAC__" or self._style & PB_STYLE_NOBG: - return wx.TRANSPARENT_BRUSH - - bkgrd = self.GetBackgroundColour() - brush = wx.Brush(bkgrd, wx.BRUSHSTYLE_SOLID) - my_attr = self.GetDefaultAttributes() - p_attr = self.Parent.GetDefaultAttributes() - my_def = bkgrd == my_attr.colBg - p_def = self.Parent.GetBackgroundColour() == p_attr.colBg - if my_def and not p_def: - bkgrd = self.Parent.GetBackgroundColour() - brush = wx.Brush(bkgrd, wx.BRUSHSTYLE_SOLID) - return brush - - def GetBitmapDisabled(self): - """Get the bitmap of the disable state - - :return: :class:`wx.Bitmap` or None - - """ - return self.BitmapDisabled - - def GetBitmapLabel(self): - """Get the label bitmap - - :return: :class:`wx.Bitmap` or None - - """ - return self.BitmapLabel - - # GetBitmap Aliases for BitmapButton api - GetBitmapFocus = GetBitmapLabel - GetBitmapHover = GetBitmapLabel - - # Alias for GetLabel - GetLabelText = wx.Control.GetLabel - - def GetMenu(self): - """Return the menu associated with this button or None if no - menu is associated with it. - - """ - return self._menu - - def GetState(self): - """Get the current state of the button - - :return: int - - .. seeAlso:: - PLATE_NORMAL, PLATE_HIGHLIGHT, PLATE_PRESSED - - """ - return self._state["cur"] - - def HasTransparentBackground(self): - """Override setting of background fill""" - return True - - def IsPressed(self): - """Return if button is pressed (PB_STYLE_TOGGLE) - - :return: bool - - """ - return self._pressed - - # ---- Event Handlers ----# - - def OnErase(self, evt): - """Trap the erase event to keep the background transparent - on windows. - - :param `evt`: wx.EVT_ERASE_BACKGROUND - - """ - pass - - def OnFocus(self, evt): - """Set the visual focus state if need be""" - if self._state["cur"] == PLATE_NORMAL: - self._SetState(PLATE_HIGHLIGHT) - - def OnKeyUp(self, evt): - """Execute a single button press action when the Return key is pressed - and this control has the focus. - - :param `evt`: wx.EVT_KEY_UP - - """ - if evt.GetKeyCode() == wx.WXK_SPACE: - self._SetState(PLATE_PRESSED) - self.__PostEvent() - wx.CallLater(100, self._SetState, PLATE_HIGHLIGHT) - else: - evt.Skip() - - def OnKillFocus(self, evt): - """Set the visual state back to normal when focus is lost - unless the control is currently in a pressed state. - - """ - # Note: this delay needs to be at least as much as the on in the KeyUp - # handler to prevent ghost highlighting from happening when - # quickly changing focus and activating buttons - if self._state["cur"] != PLATE_PRESSED: - self._SetState(PLATE_NORMAL) - - def OnLeftDown(self, evt): - """Sets the pressed state and depending on the click position will - show the popup menu if one has been set. - - """ - if self._style & PB_STYLE_TOGGLE: - self._pressed = not self._pressed - - pos = evt.GetPosition() - self._SetState(PLATE_PRESSED) - size = self.GetSize() - if pos[0] >= size[0] - 16: - if self._menu is not None: - self.ShowMenu() - elif self._style & PB_STYLE_DROPARROW: - event = PlateBtnDropArrowPressed() - event.SetEventObject(self) - self.EventHandler.ProcessEvent(event) - - self.SetFocus() - - def OnLeftUp(self, evt): - """Post a button event if the control was previously in a - pressed state. - - :param `evt`: :class:`wx.MouseEvent` - - """ - if self._state["cur"] == PLATE_PRESSED: - pos = evt.GetPosition() - size = self.GetSize() - if not (self._style & PB_STYLE_DROPARROW and pos[0] >= size[0] - 16): - self.__PostEvent() - - if self._pressed: - self._SetState(PLATE_PRESSED) - else: - self._SetState(PLATE_HIGHLIGHT) - - def OnMenuClose(self, evt): - """Refresh the control to a proper state after the menu has been - dismissed. - - :param `evt`: wx.EVT_MENU_CLOSE - - """ - mpos = wx.GetMousePosition() - if self.HitTest(self.ScreenToClient(mpos)) != wx.HT_WINDOW_OUTSIDE: - self._SetState(PLATE_HIGHLIGHT) - else: - self._SetState(PLATE_NORMAL) - evt.Skip() - - # ---- End Event Handlers ----# - - def SetBitmap(self, bmp): - """Set the bitmap displayed in the button - - :param `bmp`: :class:`wx.Bitmap` - - """ - self._bmp["enable"] = bmp - img = bmp.ConvertToImage() - img = img.ConvertToGreyscale(0.795, 0.073, 0.026) # (.634, .224, .143) - self._bmp["disable"] = img.ConvertToBitmap() - self.InvalidateBestSize() - - def SetBitmapDisabled(self, bmp): - """Set the bitmap for the disabled state - - :param `bmp`: :class:`wx.Bitmap` - - """ - self._bmp["disable"] = bmp - - # Aliases for SetBitmap* functions from BitmapButton - SetBitmapFocus = SetBitmap - SetBitmapHover = SetBitmap - SetBitmapLabel = SetBitmap - SetBitmapSelected = SetBitmap - - def SetFocus(self): - """Set this control to have the focus""" - if self._state["cur"] != PLATE_PRESSED: - self._SetState(PLATE_HIGHLIGHT) - super(PlateButton, self).SetFocus() - - def SetFont(self, font): - """Adjust size of control when font changes""" - super(PlateButton, self).SetFont(font) - self.InvalidateBestSize() - - def SetLabel(self, label): - """Set the label of the button - - :param string `label`: label string - - """ - super(PlateButton, self).SetLabel(label) - self.InvalidateBestSize() - - def SetLabelColor(self, normal, hlight=wx.NullColour): - """Set the color of the label. The optimal label color is usually - automatically selected depending on the button color. In some - cases the colors that are chosen may not be optimal. - - The normal state must be specified, if the other two params are left - Null they will be automatically guessed based on the normal color. To - prevent this automatic color choices from happening either specify - a color or None for the other params. - - :param wx.Colour `normal`: Label color for normal state (:class:`wx.Colour`) - :keyword wx.Colour `hlight`: Color for when mouse is hovering over - - """ - assert isinstance(normal, wx.Colour), "Must supply a colour object" - self._color["default"] = False - self.SetForegroundColour(normal) - - if hlight is not None: - if hlight.IsOk(): - self._color["htxt"] = hlight - else: - self._color["htxt"] = BestLabelColour(normal) - - if wx.Platform == "__WXMSW__": - self.Parent.RefreshRect(self.GetRect(), False) - else: - self.Refresh() - - def SetMenu(self, menu): - """Set the menu that can be shown when clicking on the - drop arrow of the button. - - :param wx.Menu `menu`: :class:`wx.Menu` to use as a PopupMenu - - .. note:: - Arrow is not drawn unless a menu is set - - """ - if self._menu is not None: - self.Unbind(wx.EVT_MENU_CLOSE) - - self._menu = menu - self.Bind(wx.EVT_MENU_CLOSE, self.OnMenuClose) - self.InvalidateBestSize() - - def SetPressColor(self, color): - """Set the color used for highlighting the pressed state - - :param wx.Colour `color`: :class:`wx.Colour` - - .. note:: - also resets all text colours as necessary - - """ - self._color["default"] = False - if color.Alpha() == 255: - self._color["hlight"] = AdjustAlpha(color, 200) - else: - self._color["hlight"] = color - self._color["press"] = AdjustColour(color, -10, 160) - self._color["htxt"] = BestLabelColour(self._color["hlight"]) - self.Refresh() - - def SetWindowStyle(self, style): - """Sets the window style bytes, the updates take place - immediately no need to call refresh afterwards. - - :param `style`: bitmask of PB_STYLE_* values - - """ - self._style = style - self.Refresh() - - def SetWindowVariant(self, variant): - """Set the variant/font size of this control""" - super(PlateButton, self).SetWindowVariant(variant) - self.InvalidateBestSize() - - def ShouldInheritColours(self): - """Overridden base class virtual. If the parent has non-default - colours then we want this control to inherit them. - - """ - return True - - def ShowMenu(self): - """Show the dropdown menu if one is associated with this control""" - if self._menu is not None: - self.PopupMenu(self._menu) - - # ---- End Public Member Functions ----# diff --git a/kicad_amf_plugin/utils/public_ip/__init__.py b/kicad_amf_plugin/utils/public_ip/__init__.py deleted file mode 100644 index 2cc25a7..0000000 --- a/kicad_amf_plugin/utils/public_ip/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from ._ip import get, get_ip_country - -__version__ = "0.12" diff --git a/kicad_amf_plugin/utils/public_ip/_ip.py b/kicad_amf_plugin/utils/public_ip/_ip.py deleted file mode 100644 index 98f081f..0000000 --- a/kicad_amf_plugin/utils/public_ip/_ip.py +++ /dev/null @@ -1,104 +0,0 @@ -#! /usr/bin/env python3 - -import collections -import logging -import random -import requests -import threading -import typing -from queue import Queue -import urllib -import json - -URLS = [ - "https://api.ipify.org", - "https://checkip.amazonaws.com", - "https://icanhazip.com", - "https://ifconfig.co/ip", - "https://ipecho.net/plain", - "https://ipinfo.io/ip", -] - - -def _get_ip(url: str, queue: Queue, timeout: float) -> None: - """Get external IP from 'url' and put it into 'queue'.""" - - try: - r = requests.get(url, timeout=timeout) - r.raise_for_status() - ip = r.text.strip() - logging.info("Asked %s for our IP -> %s", url, ip) - queue.put(ip) - except (requests.exceptions.HTTPError, requests.exceptions.Timeout): - pass - - -def get(nurls: int = len(URLS), timeout: float = 1) -> str: - """ "Returns the current external IP. - - Launches 'nurls' processes in parallel, each one of them fetching the - external IP from one of the websites in the URLS module-level variable. - Each independent request timeouts after 'timeout' seconds. After all of - them have completed, returns the most common IP. In this manner we will - return the correct IP as long as the majority of URLs we talk to report - our actual IP. - """ - - threads = [] - queue: Queue = Queue() - for url in random.sample(URLS, nurls): - t = threading.Thread(target=_get_ip, args=(url, queue, timeout)) - threads.append(t) - t.start() - - for t in threads: - t.join() - - ips = [] - while not queue.empty(): - ips.append(queue.get()) - - if not ips: - raise IOError("all server queries failed") - - # If there's a single IP among the responses, we're done. - counter = collections.Counter(ips) - if len(counter) == 1: - return counter.most_common(1)[0][0] - - # Make sure there isn't a tie among the two most common IPs. - top_two = counter.most_common(2) - first_ip, first_votes = top_two[0] - second_ip, second_votes = top_two[1] - if first_votes == second_votes: - raise ValueError( - f"tie between {first_ip} and {second_ip} among the " - "responses ({first_votes} occurrences each)" - ) - return first_ip - - -def get_ip(): - response = requests.get("https://api64.ipify.org?format=json").json() - return response["ip"] - - -def get_ip_country(): - GEO_IP_API_URL = "http://ip-api.com/json/" - - # Can be also site URL like this : 'google.com' - IP_TO_SEARCH = "210.138.184.59" - - # Creating request object to GeoLocation API - req = urllib.request.Request(GEO_IP_API_URL + IP_TO_SEARCH) - # Getting in response JSON - response = urllib.request.urlopen(req).read() - # Loading JSON from text to object - json_response = json.loads(response.decode("utf-8")) - - # Print country - return json_response["country"] - - -if __name__ == "__main__": - print(get_ip_country()) diff --git a/kicad_amf_plugin/utils/request_helper.py b/kicad_amf_plugin/utils/request_helper.py deleted file mode 100644 index 26d5c09..0000000 --- a/kicad_amf_plugin/utils/request_helper.py +++ /dev/null @@ -1,7 +0,0 @@ -from urllib import parse - - -class RequestHelper: - @staticmethod - def convert_dict_to_request_data(input: "dict"): - return parse.urlencode(list(input.items())).encode() diff --git a/kicad_amf_plugin/utils/roles.py b/kicad_amf_plugin/utils/roles.py deleted file mode 100644 index 778f4ce..0000000 --- a/kicad_amf_plugin/utils/roles.py +++ /dev/null @@ -1,10 +0,0 @@ -import collections -from enum import Enum - - -class Role(Enum): - EditRole = 0 - DisplayRole = EditRole + 1 - - -EditDisplayRole = collections.namedtuple("EditDisplayRole", ["EditRole", "DisplayRole"]) diff --git a/kicad_amf_plugin/plugin/kicad_amf_action_plugin.py b/plugin.py similarity index 51% rename from kicad_amf_plugin/plugin/kicad_amf_action_plugin.py rename to plugin.py index c7bced2..802a6c7 100644 --- a/kicad_amf_plugin/plugin/kicad_amf_action_plugin.py +++ b/plugin.py @@ -1,18 +1,20 @@ import pcbnew import os -from kicad_amf_plugin.plugin._main import _main -from kicad_amf_plugin.icon import ICON_ROOT +import wx +from pcbnew import * +from . import dialog_amf - -class KiCadAmfActionPlugin(pcbnew.ActionPlugin): +class Plugin(pcbnew.ActionPlugin): def __init__(self): self.name = "HQ NextPCB Active Manufacturing" self.category = "Manufacturing" self.description = "Quote and place order with one button click." self.pcbnew_icon_support = hasattr(self, "show_toolbar_button") self.show_toolbar_button = True - self.icon_file_name = os.path.join(ICON_ROOT, "icon.png") - self.dark_icon_file_name = os.path.join(ICON_ROOT, "icon.png") + self.icon_file_name = os.path.join( + os.path.dirname(__file__), 'icon.png') + self.dark_icon_file_name = os.path.join( + os.path.dirname(__file__), 'icon.png') def Run(self): - _main() + dialog_amf.AmfDialog(None).ShowModal() \ No newline at end of file diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index 6eed8bb..0000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,4 +0,0 @@ -python-gettext -pytest -requests -pre-commit diff --git a/test/__init__.py b/test/__init__.py deleted file mode 100644 index 7bb0456..0000000 --- a/test/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -import sys -import os - -TEST_ROOT = os.path.dirname(os.path.abspath(__file__)) -sys.path.append(os.path.abspath(os.path.join(TEST_ROOT, ".."))) diff --git a/test/query_price/hq_pcb.json b/test/query_price/hq_pcb.json deleted file mode 100644 index 0b553ea..0000000 --- a/test/query_price/hq_pcb.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "service": "pcb", - "region_id": "211", - "country": "211", - "express": "顺丰快递", - "blayer": "4", - "blength": "10.09", - "bwidth": "8.02", - "bcount": "5", - "sidedirection": "无", - "plate_type": "FR-4", - "units": "1", - "testpoint": 0, - "board_tg": "TG130", - "bheight": "2.5", - "copper": "1", - "lineweight": "10", - "vias": "0.15", - "color": "绿色", - "charcolor": "白色", - "cover": "过孔盖油", - "spray": "有铅喷锡", - "insidecopper": "0.5", - "impendance": "0", - "bankong": "0", - "blind": "0", - "via_in_pad": "无", - "beveledge": "0", - "pressing": "", - "baobian": "0", - "test": "Sample Test Free", - "shipment_report": "0", - "slice_report": "0", - "report_type": "0", - "review_file": 0, - "has_period": "2", - "film_report": "0", - "pcb_note": "", - "cross_board": 1, - "paper": 1, - "user_stamp": 1, - "hq_pack": 1, - "address": "广东省深圳市" -} diff --git a/test/query_price/next_pcb_en.json b/test/query_price/next_pcb_en.json deleted file mode 100644 index dcadd8a..0000000 --- a/test/query_price/next_pcb_en.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "service": "pcb", - "region_id": "211", - "country": "211", - "express": "31", - "blayer": "4", - "blength": "10.09", - "bwidth": "8.02", - "bcount": "5", - "sidedirection": "N/A", - "plate_type": "FR-4", - "units": "1", - "testpoint": 0, - "board_tg": "TG130", - "bheight": "2.5", - "copper": "1", - "lineweight": "10", - "vias": "0.15", - "color": "Green", - "charcolor": "White", - "cover": "Tenting Vias", - "spray": "HASL", - "insidecopper": "0.5", - "impendance": "0", - "bankong": "0", - "blind": "0", - "via_in_pad": "N/A", - "beveledge": "0", - "pressing": "", - "baobian": "0", - "test": "Sample Test Free", - "shipment_report": "0", - "slice_report": "0", - "report_type": "0", - "review_file": 0, - "has_period": "2", - "film_report": "0", - "pcb_note": "", - "cross_board": 1, - "paper": 1, - "user_stamp": 1 -} diff --git a/test/query_price/next_pcb_jp.json b/test/query_price/next_pcb_jp.json deleted file mode 100644 index dcadd8a..0000000 --- a/test/query_price/next_pcb_jp.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "service": "pcb", - "region_id": "211", - "country": "211", - "express": "31", - "blayer": "4", - "blength": "10.09", - "bwidth": "8.02", - "bcount": "5", - "sidedirection": "N/A", - "plate_type": "FR-4", - "units": "1", - "testpoint": 0, - "board_tg": "TG130", - "bheight": "2.5", - "copper": "1", - "lineweight": "10", - "vias": "0.15", - "color": "Green", - "charcolor": "White", - "cover": "Tenting Vias", - "spray": "HASL", - "insidecopper": "0.5", - "impendance": "0", - "bankong": "0", - "blind": "0", - "via_in_pad": "N/A", - "beveledge": "0", - "pressing": "", - "baobian": "0", - "test": "Sample Test Free", - "shipment_report": "0", - "slice_report": "0", - "report_type": "0", - "review_file": 0, - "has_period": "2", - "film_report": "0", - "pcb_note": "", - "cross_board": 1, - "paper": 1, - "user_stamp": 1 -} diff --git a/test/test_query_price.py b/test/test_query_price.py deleted file mode 100644 index 711b524..0000000 --- a/test/test_query_price.py +++ /dev/null @@ -1,35 +0,0 @@ -from .test_utils import TestUtils -from . import TEST_ROOT -from kicad_amf_plugin.utils.request_helper import RequestHelper -from kicad_amf_plugin.order.supported_region import SupportedRegion -from kicad_amf_plugin.order.order_region import OrderRegion, URL_KIND - -import requests - -import urllib -import os -import json - -REQUESTS = { - SupportedRegion.CHINA_MAINLAND: "hq_pcb.json", - SupportedRegion.JAPAN: "next_pcb_jp.json", - SupportedRegion.EUROPE_USA: "next_pcb_en.json", -} - - -def test_query_price(): - for i in REQUESTS: - form = TestUtils.read_json(os.path.join(TEST_ROOT, "query_price", REQUESTS[i])) - rep = urllib.request.Request( - OrderRegion.get_url(i, URL_KIND.QUERY_PRICE), - data=RequestHelper.convert_dict_to_request_data(form), - ) - fp = urllib.request.urlopen(rep) - data = fp.read() - encoding = fp.info().get_content_charset("utf-8") - content = data.decode(encoding) - quote = json.loads(content) - if "code" in quote: - assert quote["code"] == 200 - else: - assert quote["total"] > 0 diff --git a/test/test_utils.py b/test/test_utils.py deleted file mode 100644 index 32885fe..0000000 --- a/test/test_utils.py +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -import json - - -class TestUtils: - @staticmethod - def read_json(fp: str): - with open(fp, encoding="utf-8") as f: - return json.load(f) diff --git a/urlencodeform.py b/urlencodeform.py new file mode 100644 index 0000000..e67ef68 --- /dev/null +++ b/urlencodeform.py @@ -0,0 +1,21 @@ +from urllib import parse + +class UrlEncodeForm(): + def __init__(self): + self.form_fields = [] + return + + def get_content_type(self): + return 'application/x-www-form-urlencoded' + + def add_field(self, name, value): + """Add a simple field to the form data.""" + self.form_fields.append((name, value)) + return + def convert_to_dict(self): + """Convert form fields list to a dictionary.""" + self.form_dict = dict(self.form_fields) + return + + def make_result(self): + self.form_data = parse.urlencode(self.form_fields).encode() diff --git a/kicad_amf_plugin/utils/validators.py b/validators.py similarity index 72% rename from kicad_amf_plugin/utils/validators.py rename to validators.py index 710a4eb..44581e2 100644 --- a/kicad_amf_plugin/utils/validators.py +++ b/validators.py @@ -1,63 +1,55 @@ -import wx - - -class NumericTextCtrlValidator(wx.Validator): - def __init__(self): - wx.Validator.__init__(self) - - def Clone(self): - return NumericTextCtrlValidator() - - def Validate(self, parent): - text_ctrl = self.GetWindow() - value = text_ctrl.GetValue() - if value.isdigit(): - text_ctrl.SetBackgroundColour( - wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW) - ) - text_ctrl.Refresh() - return True - else: - text_ctrl.SetBackgroundColour(wx.Colour(255, 128, 128)) - text_ctrl.Refresh() - return False - - def TransferToWindow(self): - return True - - def TransferFromWindow(self): - return True - - -class FloatTextCtrlValidator(wx.Validator): - def __init__(self): - wx.Validator.__init__(self) - - def Clone(self): - return FloatTextCtrlValidator() - - def Validate(self, parent): - text_ctrl = self.GetWindow() - value = text_ctrl.GetValue() - if value.isdigit(): - text_ctrl.SetBackgroundColour( - wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW) - ) - text_ctrl.Refresh() - return True - elif value.replace(".", "", 1).isdigit() and value.count(".") < 2: - text_ctrl.SetBackgroundColour( - wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW) - ) - text_ctrl.Refresh() - return True - else: - text_ctrl.SetBackgroundColour(wx.Colour(255, 128, 128)) - text_ctrl.Refresh() - return False - - def TransferToWindow(self): - return True - - def TransferFromWindow(self): - return True +import wx + +class NumericTextCtrlValidator(wx.Validator): + def __init__(self): + wx.Validator.__init__(self) + + def Clone(self): + return NumericTextCtrlValidator() + + def Validate(self, parent): + text_ctrl = self.GetWindow() + value = text_ctrl.GetValue() + if value.isdigit(): + text_ctrl.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)) + text_ctrl.Refresh() + return True + else: + text_ctrl.SetBackgroundColour(wx.Colour(255, 128, 128)) + text_ctrl.Refresh() + return False + + def TransferToWindow(self): + return True + + def TransferFromWindow(self): + return True + +class FloatTextCtrlValidator(wx.Validator): + def __init__(self): + wx.Validator.__init__(self) + + def Clone(self): + return FloatTextCtrlValidator() + + def Validate(self, parent): + text_ctrl = self.GetWindow() + value = text_ctrl.GetValue() + if value.isdigit(): + text_ctrl.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)) + text_ctrl.Refresh() + return True + elif value.replace('.','',1).isdigit() and value.count('.') < 2: + text_ctrl.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)) + text_ctrl.Refresh() + return True + else: + text_ctrl.SetBackgroundColour(wx.Colour(255, 128, 128)) + text_ctrl.Refresh() + return False + + def TransferToWindow(self): + return True + + def TransferFromWindow(self): + return True