KiCad PCB EDA Suite
Loading...
Searching...
No Matches
eeschema_jobs_handler.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2022 Mark Roszko <[email protected]>
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
22#include <common.h>
23#include <pgm_base.h>
24#include <cli/exit_codes.h>
25#include <sch_plotter.h>
32#include <jobs/job_sch_erc.h>
36#include <schematic.h>
37#include <schematic_settings.h>
38#include <wx/dir.h>
39#include <wx/file.h>
40#include <memory>
41#include <connection_graph.h>
42#include "eeschema_helpers.h"
43#include <filename_resolver.h>
44#include <kiway.h>
45#include <sch_painter.h>
46#include <locale_io.h>
47#include <erc/erc.h>
48#include <erc/erc_report.h>
52#include <paths.h>
53#include <reporter.h>
54#include <string_utils.h>
55
57
58#include <sch_file_versions.h>
59#include <sch_io/sch_io.h>
61
62#include <netlist.h>
72
73#include <fields_data_model.h>
74
79#include <confirm.h>
80#include <project_sch.h>
81
83
84
86 JOB_DISPATCHER( aKiway ),
87 m_cliSchematic( nullptr )
88{
89 Register( "bom",
90 std::bind( &EESCHEMA_JOBS_HANDLER::JobExportBom, this, std::placeholders::_1 ),
91 [aKiway]( JOB* job, wxWindow* aParent ) -> bool
92 {
93 JOB_EXPORT_SCH_BOM* bomJob = dynamic_cast<JOB_EXPORT_SCH_BOM*>( job );
94
95 SCH_EDIT_FRAME* editFrame =
96 static_cast<SCH_EDIT_FRAME*>( aKiway->Player( FRAME_SCH, false ) );
97
98 wxCHECK( bomJob && editFrame, false );
99
100 DIALOG_SYMBOL_FIELDS_TABLE dlg( editFrame, bomJob );
101 return dlg.ShowModal() == wxID_OK;
102 } );
103 Register( "pythonbom",
104 std::bind( &EESCHEMA_JOBS_HANDLER::JobExportPythonBom, this, std::placeholders::_1 ),
105 []( JOB* job, wxWindow* aParent ) -> bool
106 {
107 return true;
108 } );
109 Register( "netlist",
110 std::bind( &EESCHEMA_JOBS_HANDLER::JobExportNetlist, this, std::placeholders::_1 ),
111 [aKiway]( JOB* job, wxWindow* aParent ) -> bool
112 {
113 JOB_EXPORT_SCH_NETLIST* netJob = dynamic_cast<JOB_EXPORT_SCH_NETLIST*>( job );
114
115 SCH_EDIT_FRAME* editFrame =
116 static_cast<SCH_EDIT_FRAME*>( aKiway->Player( FRAME_SCH, false ) );
117
118 wxCHECK( netJob && editFrame, false );
119
120 DIALOG_EXPORT_NETLIST dlg( editFrame, aParent, netJob );
121 return dlg.ShowModal() == wxID_OK;
122 } );
123 Register( "plot",
124 std::bind( &EESCHEMA_JOBS_HANDLER::JobExportPlot, this, std::placeholders::_1 ),
125 [aKiway]( JOB* job, wxWindow* aParent ) -> bool
126 {
127 JOB_EXPORT_SCH_PLOT* plotJob = dynamic_cast<JOB_EXPORT_SCH_PLOT*>( job );
128
129 SCH_EDIT_FRAME* editFrame =
130 static_cast<SCH_EDIT_FRAME*>( aKiway->Player( FRAME_SCH, false ) );
131
132 wxCHECK( plotJob && editFrame, false );
133
134 if( plotJob->m_plotFormat == SCH_PLOT_FORMAT::HPGL )
135 {
136 DisplayErrorMessage( editFrame,
137 _( "Plotting to HPGL is no longer supported as of KiCad 10.0." ) );
138 return false;
139 }
140
141 DIALOG_PLOT_SCHEMATIC dlg( editFrame, aParent, plotJob );
142 return dlg.ShowModal() == wxID_OK;
143 } );
144 Register( "symupgrade",
145 std::bind( &EESCHEMA_JOBS_HANDLER::JobSymUpgrade, this, std::placeholders::_1 ),
146 []( JOB* job, wxWindow* aParent ) -> bool
147 {
148 return true;
149 } );
150 Register( "symsvg",
151 std::bind( &EESCHEMA_JOBS_HANDLER::JobSymExportSvg, this, std::placeholders::_1 ),
152 []( JOB* job, wxWindow* aParent ) -> bool
153 {
154 return true;
155 } );
156 Register( "erc", std::bind( &EESCHEMA_JOBS_HANDLER::JobSchErc, this, std::placeholders::_1 ),
157 []( JOB* job, wxWindow* aParent ) -> bool
158 {
159 JOB_SCH_ERC* ercJob = dynamic_cast<JOB_SCH_ERC*>( job );
160
161 wxCHECK( ercJob, false );
162
163 DIALOG_ERC_JOB_CONFIG dlg( aParent, ercJob );
164 return dlg.ShowModal() == wxID_OK;
165 } );
166 Register( "upgrade", std::bind( &EESCHEMA_JOBS_HANDLER::JobUpgrade, this, std::placeholders::_1 ),
167 []( JOB* job, wxWindow* aParent ) -> bool
168 {
169 return true;
170 } );
171}
172
173
175{
176 SCHEMATIC* sch = nullptr;
177
178 if( !Pgm().IsGUI() && Pgm().GetSettingsManager().IsProjectOpenNotDummy() )
179 {
181 wxString schPath = aPath;
182
183 if( schPath.IsEmpty() )
184 {
185 wxFileName path = project.GetProjectFullName();
187 path.MakeAbsolute();
188 schPath = path.GetFullPath();
189 }
190
191 if( !m_cliSchematic )
192 m_cliSchematic = EESCHEMA_HELPERS::LoadSchematic( schPath, true, false, &project );
193
194 sch = m_cliSchematic;
195 }
196 else if( Pgm().IsGUI() && Pgm().GetSettingsManager().IsProjectOpen() )
197 {
198 SCH_EDIT_FRAME* editFrame = static_cast<SCH_EDIT_FRAME*>( m_kiway->Player( FRAME_SCH, false ) );
199
200 if( editFrame )
201 sch = &editFrame->Schematic();
202 }
203 else if( !aPath.IsEmpty() )
204 {
205 sch = EESCHEMA_HELPERS::LoadSchematic( aPath, true, false );
206 }
207
208 if( !sch )
209 m_reporter->Report( _( "Failed to load schematic\n" ), RPT_SEVERITY_ERROR );
210
211 return sch;
212}
213
215 const wxString& aTheme, SCHEMATIC* aSch,
216 const wxString& aDrawingSheetOverride )
217{
218 COLOR_SETTINGS* cs = ::GetColorSettings( aTheme );
219 aRenderSettings->LoadColors( cs );
220 aRenderSettings->m_ShowHiddenPins = false;
221 aRenderSettings->m_ShowHiddenFields = false;
222 aRenderSettings->m_ShowPinAltIcons = false;
223
224 aRenderSettings->SetDefaultPenWidth( aSch->Settings().m_DefaultLineWidth );
225 aRenderSettings->m_LabelSizeRatio = aSch->Settings().m_LabelSizeRatio;
226 aRenderSettings->m_TextOffsetRatio = aSch->Settings().m_TextOffsetRatio;
227 aRenderSettings->m_PinSymbolSize = aSch->Settings().m_PinSymbolSize;
228
229 aRenderSettings->SetDashLengthRatio( aSch->Settings().m_DashedLineDashRatio );
230 aRenderSettings->SetGapLengthRatio( aSch->Settings().m_DashedLineGapRatio );
231
232 // Load the drawing sheet from the filename stored in BASE_SCREEN::m_DrawingSheetFileName.
233 // If empty, or not existing, the default drawing sheet is loaded.
234
235 auto loadSheet =
236 [&]( const wxString& path ) -> bool
237 {
238 wxString msg;
239 FILENAME_RESOLVER resolve;
240 resolve.SetProject( &aSch->Project() );
241 resolve.SetProgramBase( &Pgm() );
242
243 wxString absolutePath = resolve.ResolvePath( path, wxGetCwd(),
244 { aSch->GetEmbeddedFiles() } );
245
246 if( !DS_DATA_MODEL::GetTheInstance().LoadDrawingSheet( absolutePath, &msg ) )
247 {
248 m_reporter->Report( wxString::Format( _( "Error loading drawing sheet '%s'." ), path )
249 + wxS( "\n" ) + msg + wxS( "\n" ),
251 return false;
252 }
253
254 return true;
255 };
256
257 // try to load the override first
258 if( !aDrawingSheetOverride.IsEmpty() && loadSheet( aDrawingSheetOverride ) )
259 return;
260
261 // no override or failed override continues here
262 loadSheet( aSch->Settings().m_SchDrawingSheetFileName );
263}
264
265
267{
268 JOB_EXPORT_SCH_PLOT* aPlotJob = dynamic_cast<JOB_EXPORT_SCH_PLOT*>( aJob );
269
270 wxCHECK( aPlotJob, CLI::EXIT_CODES::ERR_UNKNOWN );
271
272 if( aPlotJob->m_plotFormat == SCH_PLOT_FORMAT::HPGL )
273 {
274 m_reporter->Report( _( "Plotting to HPGL is no longer supported as of KiCad 10.0.\n" ),
277 }
278
279 SCHEMATIC* sch = getSchematic( aPlotJob->m_filename );
280
281 if( !sch )
283
284 aJob->SetTitleBlock( sch->RootScreen()->GetTitleBlock() );
285 sch->Project().ApplyTextVars( aJob->GetVarOverrides() );
286
287 std::unique_ptr<SCH_RENDER_SETTINGS> renderSettings = std::make_unique<SCH_RENDER_SETTINGS>();
288 InitRenderSettings( renderSettings.get(), aPlotJob->m_theme, sch, aPlotJob->m_drawingSheet );
289
290 wxString font = aPlotJob->m_defaultFont;
291
292 if( font.IsEmpty() )
293 {
295 font = cfg ? cfg->m_Appearance.default_font : wxString( KICAD_FONT_NAME );
296 }
297
298 renderSettings->SetDefaultFont( font );
299 renderSettings->SetMinPenWidth( aPlotJob->m_minPenWidth );
300
301 std::unique_ptr<SCH_PLOTTER> schPlotter = std::make_unique<SCH_PLOTTER>( sch );
302
304
305 switch( aPlotJob->m_plotFormat )
306 {
307 case SCH_PLOT_FORMAT::DXF: format = PLOT_FORMAT::DXF; break;
308 case SCH_PLOT_FORMAT::PDF: format = PLOT_FORMAT::PDF; break;
309 case SCH_PLOT_FORMAT::SVG: format = PLOT_FORMAT::SVG; break;
310 case SCH_PLOT_FORMAT::POST: format = PLOT_FORMAT::POST; break;
311 case SCH_PLOT_FORMAT::HPGL: /* no longer supported */ break;
312 }
313
314 int pageSizeSelect = PageFormatReq::PAGE_SIZE_AUTO;
315
316 switch( aPlotJob->m_pageSizeSelect )
317 {
318 case JOB_PAGE_SIZE::PAGE_SIZE_A: pageSizeSelect = PageFormatReq::PAGE_SIZE_A; break;
319 case JOB_PAGE_SIZE::PAGE_SIZE_A4: pageSizeSelect = PageFormatReq::PAGE_SIZE_A4; break;
321 }
322
323 wxString outPath = aPlotJob->GetFullOutputPath( &sch->Project() );
324
325 if( !PATHS::EnsurePathExists( outPath, !aPlotJob->GetOutputPathIsDirectory() ) )
326 {
327 m_reporter->Report( _( "Failed to create output directory\n" ), RPT_SEVERITY_ERROR );
329 }
330
331 SCH_PLOT_OPTS plotOpts;
332 plotOpts.m_blackAndWhite = aPlotJob->m_blackAndWhite;
333 plotOpts.m_PDFPropertyPopups = aPlotJob->m_PDFPropertyPopups;
335 plotOpts.m_PDFMetadata = aPlotJob->m_PDFMetadata;
336
337 if( aPlotJob->GetOutputPathIsDirectory() )
338 {
339 plotOpts.m_outputDirectory = outPath;
340 plotOpts.m_outputFile = wxEmptyString;
341 }
342 else
343 {
344 plotOpts.m_outputDirectory = wxEmptyString;
345 plotOpts.m_outputFile = outPath;
346 }
347
348 plotOpts.m_pageSizeSelect = pageSizeSelect;
349 plotOpts.m_plotAll = aPlotJob->m_plotAll;
350 plotOpts.m_plotDrawingSheet = aPlotJob->m_plotDrawingSheet;
351 plotOpts.m_plotPages = aPlotJob->m_plotPages;
352 plotOpts.m_theme = aPlotJob->m_theme;
353 plotOpts.m_useBackgroundColor = aPlotJob->m_useBackgroundColor;
354 plotOpts.m_plotHopOver = aPlotJob->m_show_hop_over;
355
356 // Always export dxf in mm by kicad-cli (similar to Pcbnew)
358
359 schPlotter->Plot( format, plotOpts, renderSettings.get(), m_reporter );
360
361 if( m_reporter->HasMessageOfSeverity( RPT_SEVERITY_ERROR ) )
363
364 return CLI::EXIT_CODES::OK;
365}
366
367
369{
370 JOB_EXPORT_SCH_NETLIST* aNetJob = dynamic_cast<JOB_EXPORT_SCH_NETLIST*>( aJob );
371
372 wxCHECK( aNetJob, CLI::EXIT_CODES::ERR_UNKNOWN );
373
374 SCHEMATIC* sch = getSchematic( aNetJob->m_filename );
375
376 if( !sch )
378
379 aJob->SetTitleBlock( sch->RootScreen()->GetTitleBlock() );
380 sch->Project().ApplyTextVars( aJob->GetVarOverrides() );
381
382 // Annotation warning check
383 SCH_REFERENCE_LIST referenceList;
384 sch->Hierarchy().GetSymbols( referenceList );
385
386 if( referenceList.GetCount() > 0 )
387 {
388 if( referenceList.CheckAnnotation(
389 []( ERCE_T, const wxString&, SCH_REFERENCE*, SCH_REFERENCE* )
390 {
391 // We're only interested in the end result -- either errors or not
392 } )
393 > 0 )
394 {
395 m_reporter->Report( _( "Warning: schematic has annotation errors, please use the "
396 "schematic editor to fix them\n" ),
398 }
399 }
400
401 // Test duplicate sheet names:
402 ERC_TESTER erc( sch );
403
404 if( erc.TestDuplicateSheetNames( false ) > 0 )
405 m_reporter->Report( _( "Warning: duplicate sheet names.\n" ), RPT_SEVERITY_WARNING );
406
407 std::unique_ptr<NETLIST_EXPORTER_BASE> helper;
408 unsigned netlistOption = 0;
409
410 wxString fileExt;
411
412 switch( aNetJob->format )
413 {
416 helper = std::make_unique<NETLIST_EXPORTER_KICAD>( sch );
417 break;
418
421 helper = std::make_unique<NETLIST_EXPORTER_ORCADPCB2>( sch );
422 break;
423
426 helper = std::make_unique<NETLIST_EXPORTER_CADSTAR>( sch );
427 break;
428
432 helper = std::make_unique<NETLIST_EXPORTER_SPICE>( sch );
433 break;
434
437 helper = std::make_unique<NETLIST_EXPORTER_SPICE_MODEL>( sch );
438 break;
439
441 fileExt = wxS( "xml" );
442 helper = std::make_unique<NETLIST_EXPORTER_XML>( sch );
443 break;
444
446 fileExt = wxS( "asc" );
447 helper = std::make_unique<NETLIST_EXPORTER_PADS>( sch );
448 break;
449
451 fileExt = wxS( "txt" );
452 helper = std::make_unique<NETLIST_EXPORTER_ALLEGRO>( sch );
453 break;
454
455 default:
456 m_reporter->Report( _( "Unknown netlist format.\n" ), RPT_SEVERITY_ERROR );
458 }
459
460 if( aNetJob->GetConfiguredOutputPath().IsEmpty() )
461 {
462 wxFileName fn = sch->GetFileName();
463 fn.SetName( fn.GetName() );
464 fn.SetExt( fileExt );
465
466 aNetJob->SetConfiguredOutputPath( fn.GetFullName() );
467 }
468
469 wxString outPath = aNetJob->GetFullOutputPath( &sch->Project() );
470
471 if( !PATHS::EnsurePathExists( outPath, true ) )
472 {
473 m_reporter->Report( _( "Failed to create output directory\n" ), RPT_SEVERITY_ERROR );
475 }
476
477 bool res = helper->WriteNetlist( outPath, netlistOption, *m_reporter );
478
479 if( !res )
481
482 return CLI::EXIT_CODES::OK;
483}
484
485
487{
488 JOB_EXPORT_SCH_BOM* aBomJob = dynamic_cast<JOB_EXPORT_SCH_BOM*>( aJob );
489
490 wxCHECK( aBomJob, CLI::EXIT_CODES::ERR_UNKNOWN );
491
492 SCHEMATIC* sch = getSchematic( aBomJob->m_filename );
493
494 if( !sch )
496
497 aJob->SetTitleBlock( sch->RootScreen()->GetTitleBlock() );
498 sch->Project().ApplyTextVars( aJob->GetVarOverrides() );
499
500 // Annotation warning check
501 SCH_REFERENCE_LIST referenceList;
502 sch->Hierarchy().GetSymbols( referenceList, false, false );
503
504 if( referenceList.GetCount() > 0 )
505 {
506 SCH_REFERENCE_LIST copy = referenceList;
507
508 // Check annotation splits references...
509 if( copy.CheckAnnotation(
510 []( ERCE_T, const wxString&, SCH_REFERENCE*, SCH_REFERENCE* )
511 {
512 // We're only interested in the end result -- either errors or not
513 } )
514 > 0 )
515 {
516 m_reporter->Report(
517 _( "Warning: schematic has annotation errors, please use the schematic "
518 "editor to fix them\n" ),
520 }
521 }
522
523 // Test duplicate sheet names:
524 ERC_TESTER erc( sch );
525
526 if( erc.TestDuplicateSheetNames( false ) > 0 )
527 m_reporter->Report( _( "Warning: duplicate sheet names.\n" ), RPT_SEVERITY_WARNING );
528
529 // Build our data model
530 FIELDS_EDITOR_GRID_DATA_MODEL dataModel( referenceList, nullptr );
531
532 // Mandatory fields + quantity virtual field first
533 for( FIELD_T fieldId : MANDATORY_FIELDS )
534 {
535 dataModel.AddColumn( GetCanonicalFieldName( fieldId ),
536 GetDefaultFieldName( fieldId, DO_TRANSLATE ), false, {} );
537 }
538
539 // User field names in symbols second
540 std::set<wxString> userFieldNames;
541
542 for( size_t i = 0; i < referenceList.GetCount(); ++i )
543 {
544 SCH_SYMBOL* symbol = referenceList[i].GetSymbol();
545
546 for( SCH_FIELD& field : symbol->GetFields() )
547 {
548 if( !field.IsMandatory() && !field.IsPrivate() )
549 userFieldNames.insert( field.GetName() );
550 }
551 }
552
553 for( const wxString& fieldName : userFieldNames )
554 dataModel.AddColumn( fieldName, GetGeneratedFieldDisplayName( fieldName ), true, {} );
555
556 // Add any templateFieldNames which aren't already present in the userFieldNames
557 for( const TEMPLATE_FIELDNAME& templateFieldname :
559 {
560 if( userFieldNames.count( templateFieldname.m_Name ) == 0 )
561 {
562 dataModel.AddColumn( templateFieldname.m_Name, GetGeneratedFieldDisplayName( templateFieldname.m_Name ),
563 false, {} );
564 }
565 }
566
567 BOM_PRESET preset;
568
569 // Load a preset if one is specified
570 if( !aBomJob->m_bomPresetName.IsEmpty() )
571 {
572 // Find the preset
573 const BOM_PRESET* schPreset = nullptr;
574
575 for( const BOM_PRESET& p : BOM_PRESET::BuiltInPresets() )
576 {
577 if( p.name == aBomJob->m_bomPresetName )
578 {
579 schPreset = &p;
580 break;
581 }
582 }
583
584 for( const BOM_PRESET& p : sch->Settings().m_BomPresets )
585 {
586 if( p.name == aBomJob->m_bomPresetName )
587 {
588 schPreset = &p;
589 break;
590 }
591 }
592
593 if( !schPreset )
594 {
595 m_reporter->Report( wxString::Format( _( "BOM preset '%s' not found" ) + wxS( "\n" ),
596 aBomJob->m_bomPresetName ),
598
600 }
601
602 preset = *schPreset;
603 }
604 else
605 {
606 size_t i = 0;
607
608 for( const wxString& fieldName : aBomJob->m_fieldsOrdered )
609 {
610 // Handle wildcard. We allow the wildcard anywhere in the list, but it needs to respect
611 // fields that come before and after the wildcard.
612 if( fieldName == wxS( "*" ) )
613 {
614 for( const BOM_FIELD& modelField : dataModel.GetFieldsOrdered() )
615 {
616 struct BOM_FIELD field;
617
618 field.name = modelField.name;
619 field.show = true;
620 field.groupBy = false;
621 field.label = field.name;
622
623 bool fieldAlreadyPresent = false;
624
625 for( BOM_FIELD& presetField : preset.fieldsOrdered )
626 {
627 if( presetField.name == field.name )
628 {
629 fieldAlreadyPresent = true;
630 break;
631 }
632 }
633
634 bool fieldLaterInList = false;
635
636 for( const wxString& fieldInList : aBomJob->m_fieldsOrdered )
637 {
638 if( fieldInList == field.name )
639 {
640 fieldLaterInList = true;
641 break;
642 }
643 }
644
645 if( !fieldAlreadyPresent && !fieldLaterInList )
646 preset.fieldsOrdered.emplace_back( field );
647 }
648
649 continue;
650 }
651
652 struct BOM_FIELD field;
653
654 field.name = fieldName;
655 field.show = !fieldName.StartsWith( wxT( "__" ), &field.name );
656 field.groupBy = alg::contains( aBomJob->m_fieldsGroupBy, field.name );
657
658 if( ( aBomJob->m_fieldsLabels.size() > i ) && !aBomJob->m_fieldsLabels[i].IsEmpty() )
659 field.label = aBomJob->m_fieldsLabels[i];
660 else if( IsGeneratedField( field.name ) )
661 field.label = GetGeneratedFieldDisplayName( field.name );
662 else
663 field.label = field.name;
664
665 preset.fieldsOrdered.emplace_back( field );
666 i++;
667 }
668
669 preset.sortAsc = aBomJob->m_sortAsc;
670 preset.sortField = aBomJob->m_sortField;
671 preset.filterString = aBomJob->m_filterString;
672 preset.groupSymbols = ( aBomJob->m_fieldsGroupBy.size() > 0 );
673 preset.excludeDNP = aBomJob->m_excludeDNP;
674 }
675
676 dataModel.ApplyBomPreset( preset, {} );
677
678 if( aBomJob->GetConfiguredOutputPath().IsEmpty() )
679 {
680 wxFileName fn = sch->GetFileName();
681 fn.SetName( fn.GetName() );
682 fn.SetExt( FILEEXT::CsvFileExtension );
683
684 aBomJob->SetConfiguredOutputPath( fn.GetFullName() );
685 }
686
687 wxString outPath = aBomJob->GetFullOutputPath( &sch->Project() );
688
689 if( !PATHS::EnsurePathExists( outPath, true ) )
690 {
691 m_reporter->Report( _( "Failed to create output directory\n" ), RPT_SEVERITY_ERROR );
693 }
694
695 wxFile f;
696
697 if( !f.Open( outPath, wxFile::write ) )
698 {
699 m_reporter->Report( wxString::Format( _( "Unable to open destination '%s'" ), outPath ),
701
703 }
704
705 BOM_FMT_PRESET fmt;
706
707 // Load a format preset if one is specified
708 if( !aBomJob->m_bomFmtPresetName.IsEmpty() )
709 {
710 // Find the preset
711 std::optional<BOM_FMT_PRESET> schFmtPreset;
712
714 {
715 if( p.name == aBomJob->m_bomFmtPresetName )
716 {
717 schFmtPreset = p;
718 break;
719 }
720 }
721
722 for( const BOM_FMT_PRESET& p : sch->Settings().m_BomFmtPresets )
723 {
724 if( p.name == aBomJob->m_bomFmtPresetName )
725 {
726 schFmtPreset = p;
727 break;
728 }
729 }
730
731 if( !schFmtPreset )
732 {
733 m_reporter->Report( wxString::Format( _( "BOM format preset '%s' not found" ) + wxS( "\n" ),
734 aBomJob->m_bomFmtPresetName ),
736
738 }
739
740 fmt = *schFmtPreset;
741 }
742 else
743 {
744 fmt.fieldDelimiter = aBomJob->m_fieldDelimiter;
745 fmt.stringDelimiter = aBomJob->m_stringDelimiter;
746 fmt.refDelimiter = aBomJob->m_refDelimiter;
748 fmt.keepTabs = aBomJob->m_keepTabs;
749 fmt.keepLineBreaks = aBomJob->m_keepLineBreaks;
750 }
751
752 bool res = f.Write( dataModel.Export( fmt ) );
753
754 if( !res )
756
757 m_reporter->Report( wxString::Format( _( "Wrote bill of materials to '%s'." ), outPath ),
759
760 return CLI::EXIT_CODES::OK;
761}
762
763
765{
766 JOB_EXPORT_SCH_PYTHONBOM* aNetJob = dynamic_cast<JOB_EXPORT_SCH_PYTHONBOM*>( aJob );
767
768 wxCHECK( aNetJob, CLI::EXIT_CODES::ERR_UNKNOWN );
769
770 SCHEMATIC* sch = getSchematic( aNetJob->m_filename );
771
772 if( !sch )
774
775 aJob->SetTitleBlock( sch->RootScreen()->GetTitleBlock() );
776 sch->Project().ApplyTextVars( aJob->GetVarOverrides() );
777
778 // Annotation warning check
779 SCH_REFERENCE_LIST referenceList;
780 sch->Hierarchy().GetSymbols( referenceList );
781
782 if( referenceList.GetCount() > 0 )
783 {
784 if( referenceList.CheckAnnotation(
785 []( ERCE_T, const wxString&, SCH_REFERENCE*, SCH_REFERENCE* )
786 {
787 // We're only interested in the end result -- either errors or not
788 } )
789 > 0 )
790 {
791 m_reporter->Report( _( "Warning: schematic has annotation errors, please use the "
792 "schematic editor to fix them\n" ),
794 }
795 }
796
797 // Test duplicate sheet names:
798 ERC_TESTER erc( sch );
799
800 if( erc.TestDuplicateSheetNames( false ) > 0 )
801 m_reporter->Report( _( "Warning: duplicate sheet names.\n" ), RPT_SEVERITY_WARNING );
802
803 std::unique_ptr<NETLIST_EXPORTER_XML> xmlNetlist =
804 std::make_unique<NETLIST_EXPORTER_XML>( sch );
805
806 if( aNetJob->GetConfiguredOutputPath().IsEmpty() )
807 {
808 wxFileName fn = sch->GetFileName();
809 fn.SetName( fn.GetName() + "-bom" );
810 fn.SetExt( FILEEXT::XmlFileExtension );
811
812 aNetJob->SetConfiguredOutputPath( fn.GetFullName() );
813 }
814
815 wxString outPath = aNetJob->GetFullOutputPath( &sch->Project() );
816
817 if( !PATHS::EnsurePathExists( outPath, true ) )
818 {
819 m_reporter->Report( _( "Failed to create output directory\n" ), RPT_SEVERITY_ERROR );
821 }
822
823 bool res = xmlNetlist->WriteNetlist( outPath, GNL_OPT_BOM, *m_reporter );
824
825 if( !res )
827
828 m_reporter->Report( wxString::Format( _( "Wrote bill of materials to '%s'." ), outPath ),
830
831 return CLI::EXIT_CODES::OK;
832}
833
834
836 LIB_SYMBOL* symbol )
837{
838 wxCHECK( symbol, CLI::EXIT_CODES::ERR_UNKNOWN );
839
840 std::shared_ptr<LIB_SYMBOL> parent;
841 LIB_SYMBOL* symbolToPlot = symbol;
842
843 // if the symbol is an alias, then the draw items are stored in the root symbol
844 if( symbol->IsDerived() )
845 {
846 parent = symbol->GetRootSymbol();
847
848 wxCHECK( parent, CLI::EXIT_CODES::ERR_UNKNOWN );
849
850 symbolToPlot = parent.get();
851 }
852
853 // iterate from unit 1, unit 0 would be "all units" which we don't want
854 for( int unit = 1; unit < symbol->GetUnitCount() + 1; unit++ )
855 {
856 for( int bodyStyle = 1; bodyStyle <= symbol->GetBodyStyleCount(); ++bodyStyle )
857 {
858 wxString filename;
859 wxFileName fn;
860
861 fn.SetPath( aSvgJob->m_outputDirectory );
862 fn.SetExt( FILEEXT::SVGFileExtension );
863
864 filename = symbol->GetName();
865
866 for( wxChar c : wxFileName::GetForbiddenChars( wxPATH_DOS ) )
867 filename.Replace( c, ' ' );
868
869 // Even single units get a unit number in the filename. This simplifies the
870 // handling of the files as they have a uniform pattern.
871 // Also avoids aliasing 'sym', unit 2 and 'sym_unit2', unit 1 to the same file.
872 filename += wxString::Format( "_unit%d", unit );
873
874 if( symbol->HasDeMorganBodyStyles() )
875 {
876 if( bodyStyle == 2 )
877 filename += wxS( "_demorgan" );
878 }
879 else if( bodyStyle <= (int) symbol->GetBodyStyleNames().size() )
880 {
881 filename += wxS( "_" ) + symbol->GetBodyStyleNames()[bodyStyle-1].Lower();
882 }
883
884 fn.SetName( filename );
885 m_reporter->Report( wxString::Format( _( "Plotting symbol '%s' unit %d to '%s'\n" ),
886 symbol->GetName(),
887 unit,
888 fn.GetFullPath() ),
890
891 // Get the symbol bounding box to fit the plot page to it
892 BOX2I symbolBB = symbol->Flatten()->GetUnitBoundingBox( unit, bodyStyle,
893 !aSvgJob->m_includeHiddenFields );
895 pageInfo.SetHeightMils( schIUScale.IUToMils( symbolBB.GetHeight() * 1.2 ) );
896 pageInfo.SetWidthMils( schIUScale.IUToMils( symbolBB.GetWidth() * 1.2 ) );
897
898 SVG_PLOTTER* plotter = new SVG_PLOTTER();
899 plotter->SetRenderSettings( aRenderSettings );
900 plotter->SetPageSettings( pageInfo );
901 plotter->SetColorMode( !aSvgJob->m_blackAndWhite );
902
903 VECTOR2I plot_offset = symbolBB.GetCenter();
904 const double scale = 1.0;
905
906 // Currently, plot units are in decimal
907 plotter->SetViewport( plot_offset, schIUScale.IU_PER_MILS / 10, scale, false );
908
909 plotter->SetCreator( wxT( "Eeschema-SVG" ) );
910
911 if( !plotter->OpenFile( fn.GetFullPath() ) )
912 {
913 m_reporter->Report( wxString::Format( _( "Unable to open destination '%s'" ) + wxS( "\n" ),
914 fn.GetFullPath() ),
916
917 delete plotter;
919 }
920
921 LOCALE_IO toggle;
922 SCH_PLOT_OPTS plotOpts;
923
924 plotter->StartPlot( wxT( "1" ) );
925
926 bool background = true;
927 VECTOR2I offset( pageInfo.GetWidthIU( schIUScale.IU_PER_MILS ) / 2,
928 pageInfo.GetHeightIU( schIUScale.IU_PER_MILS ) / 2 );
929
930 // note, we want the fields from the original symbol pointer (in case of non-alias)
931 symbolToPlot->Plot( plotter, background, plotOpts, unit, bodyStyle, offset, false );
932 symbol->PlotFields( plotter, background, plotOpts, unit, bodyStyle, offset, false );
933
934 symbolToPlot->Plot( plotter, !background, plotOpts, unit, bodyStyle, offset, false );
935 symbol->PlotFields( plotter, !background, plotOpts, unit, bodyStyle, offset, false );
936
937 plotter->EndPlot();
938 delete plotter;
939 }
940 }
941
942 if( m_reporter->HasMessageOfSeverity( RPT_SEVERITY_ERROR ) )
944
945 return CLI::EXIT_CODES::OK;
946}
947
948
950{
951 JOB_SYM_EXPORT_SVG* svgJob = dynamic_cast<JOB_SYM_EXPORT_SVG*>( aJob );
952
953 wxCHECK( svgJob, CLI::EXIT_CODES::ERR_UNKNOWN );
954
955 wxFileName fn( svgJob->m_libraryPath );
956 fn.MakeAbsolute();
957
958 SCH_IO_KICAD_SEXPR_LIB_CACHE schLibrary( fn.GetFullPath() );
959
960 try
961 {
962 schLibrary.Load();
963 }
964 catch( ... )
965 {
966 m_reporter->Report( _( "Unable to load library\n" ), RPT_SEVERITY_ERROR );
968 }
969
971 m_progressReporter->KeepRefreshing();
972
973 LIB_SYMBOL* symbol = nullptr;
974
975 if( !svgJob->m_symbol.IsEmpty() )
976 {
977 // See if the selected symbol exists
978 symbol = schLibrary.GetSymbol( svgJob->m_symbol );
979
980 if( !symbol )
981 {
982 m_reporter->Report( _( "There is no symbol selected to save." ) + wxS( "\n" ),
985 }
986 }
987
988 if( !svgJob->m_outputDirectory.IsEmpty() && !wxDir::Exists( svgJob->m_outputDirectory ) )
989 {
990 if( !wxFileName::Mkdir( svgJob->m_outputDirectory ) )
991 {
992 m_reporter->Report( wxString::Format( _( "Unable to create output directory '%s'." ) + wxS( "\n" ),
993 svgJob->m_outputDirectory ),
996 }
997 }
998
999 SCH_RENDER_SETTINGS renderSettings;
1001 renderSettings.LoadColors( cs );
1002 renderSettings.SetDefaultPenWidth( DEFAULT_LINE_WIDTH_MILS * schIUScale.IU_PER_MILS );
1003 renderSettings.m_ShowHiddenPins = svgJob->m_includeHiddenPins;
1004 renderSettings.m_ShowHiddenFields = svgJob->m_includeHiddenFields;
1005
1006 int exitCode = CLI::EXIT_CODES::OK;
1007
1008 if( symbol )
1009 {
1010 exitCode = doSymExportSvg( svgJob, &renderSettings, symbol );
1011 }
1012 else
1013 {
1014 // Just plot all the symbols we can
1015 const LIB_SYMBOL_MAP& libSymMap = schLibrary.GetSymbolMap();
1016
1017 for( const auto& [name, libSymbol] : libSymMap )
1018 {
1019 if( m_progressReporter )
1020 {
1021 m_progressReporter->AdvancePhase( wxString::Format( _( "Exporting %s" ), name ) );
1022 m_progressReporter->KeepRefreshing();
1023 }
1024
1025 exitCode = doSymExportSvg( svgJob, &renderSettings, libSymbol );
1026
1027 if( exitCode != CLI::EXIT_CODES::OK )
1028 break;
1029 }
1030 }
1031
1032 return exitCode;
1033}
1034
1035
1037{
1038 JOB_SYM_UPGRADE* upgradeJob = dynamic_cast<JOB_SYM_UPGRADE*>( aJob );
1039
1040 wxCHECK( upgradeJob, CLI::EXIT_CODES::ERR_UNKNOWN );
1041
1042 wxFileName fn( upgradeJob->m_libraryPath );
1043 fn.MakeAbsolute();
1044
1045 SCH_IO_MGR::SCH_FILE_T fileType = SCH_IO_MGR::GuessPluginTypeFromLibPath( fn.GetFullPath() );
1046
1047 if( !upgradeJob->m_outputLibraryPath.IsEmpty() )
1048 {
1049 if( wxFile::Exists( upgradeJob->m_outputLibraryPath ) )
1050 {
1051 m_reporter->Report( _( "Output path must not conflict with existing path\n" ),
1053
1055 }
1056 }
1057 else if( fileType != SCH_IO_MGR::SCH_KICAD )
1058 {
1059 m_reporter->Report( _( "Output path must be specified to convert legacy and non-KiCad libraries\n" ),
1061
1063 }
1064
1065 if( fileType == SCH_IO_MGR::SCH_KICAD )
1066 {
1067 SCH_IO_KICAD_SEXPR_LIB_CACHE schLibrary( fn.GetFullPath() );
1068
1069 try
1070 {
1071 schLibrary.Load();
1072 }
1073 catch( ... )
1074 {
1075 m_reporter->Report( _( "Unable to load library\n" ), RPT_SEVERITY_ERROR );
1077 }
1078
1079 if( m_progressReporter )
1080 m_progressReporter->KeepRefreshing();
1081
1082 bool shouldSave =
1084
1085 if( shouldSave )
1086 {
1087 m_reporter->Report( _( "Saving symbol library in updated format\n" ), RPT_SEVERITY_ACTION );
1088
1089 try
1090 {
1091 if( !upgradeJob->m_outputLibraryPath.IsEmpty() )
1092 schLibrary.SetFileName( upgradeJob->m_outputLibraryPath );
1093
1094 schLibrary.SetModified();
1095 schLibrary.Save();
1096 }
1097 catch( ... )
1098 {
1099 m_reporter->Report( ( "Unable to save library\n" ), RPT_SEVERITY_ERROR );
1101 }
1102 }
1103 else
1104 {
1105 m_reporter->Report( _( "Symbol library was not updated\n" ), RPT_SEVERITY_ERROR );
1106 }
1107 }
1108 else
1109 {
1110 if( !SCH_IO_MGR::ConvertLibrary( nullptr, fn.GetAbsolutePath(), upgradeJob->m_outputLibraryPath ) )
1111 {
1112 m_reporter->Report( ( "Unable to convert library\n" ), RPT_SEVERITY_ERROR );
1114 }
1115 }
1116
1117 return CLI::EXIT_CODES::OK;
1118}
1119
1120
1121
1123{
1124 JOB_SCH_ERC* ercJob = dynamic_cast<JOB_SCH_ERC*>( aJob );
1125
1126 wxCHECK( ercJob, CLI::EXIT_CODES::ERR_UNKNOWN );
1127
1128 SCHEMATIC* sch = getSchematic( ercJob->m_filename );
1129
1130 if( !sch )
1132
1133 aJob->SetTitleBlock( sch->RootScreen()->GetTitleBlock() );
1134 sch->Project().ApplyTextVars( aJob->GetVarOverrides() );
1135
1136 if( ercJob->GetConfiguredOutputPath().IsEmpty() )
1137 {
1138 wxFileName fn = sch->GetFileName();
1139 fn.SetName( fn.GetName() + wxS( "-erc" ) );
1140
1142 fn.SetExt( FILEEXT::JsonFileExtension );
1143 else
1144 fn.SetExt( FILEEXT::ReportFileExtension );
1145
1146 ercJob->SetConfiguredOutputPath( fn.GetFullName() );
1147 }
1148
1149 wxString outPath = ercJob->GetFullOutputPath( &sch->Project() );
1150
1151 if( !PATHS::EnsurePathExists( outPath, true ) )
1152 {
1153 m_reporter->Report( _( "Failed to create output directory\n" ), RPT_SEVERITY_ERROR );
1155 }
1156
1157 EDA_UNITS units;
1158
1159 switch( ercJob->m_units )
1160 {
1161 case JOB_SCH_ERC::UNITS::INCH: units = EDA_UNITS::INCH; break;
1162 case JOB_SCH_ERC::UNITS::MILS: units = EDA_UNITS::MILS; break;
1163 case JOB_SCH_ERC::UNITS::MM: units = EDA_UNITS::MM; break;
1164 default: units = EDA_UNITS::MM; break;
1165 }
1166
1167 std::shared_ptr<SHEETLIST_ERC_ITEMS_PROVIDER> markersProvider =
1168 std::make_shared<SHEETLIST_ERC_ITEMS_PROVIDER>( sch );
1169
1170 // Running ERC requires libraries be loaded, so make sure they have been
1172 adapter->AsyncLoad();
1173 adapter->BlockUntilLoaded();
1174
1175 ERC_TESTER ercTester( sch );
1176
1177 std::unique_ptr<DS_PROXY_VIEW_ITEM> drawingSheet( getDrawingSheetProxyView( sch ) );
1178 ercTester.RunTests( drawingSheet.get(), nullptr, m_kiway->KiFACE( KIWAY::FACE_CVPCB ),
1179 &sch->Project(), m_progressReporter );
1180
1181 markersProvider->SetSeverities( ercJob->m_severity );
1182
1183 m_reporter->Report( wxString::Format( _( "Found %d violations\n" ), markersProvider->GetCount() ),
1185
1186 ERC_REPORT reportWriter( sch, units );
1187
1188 bool wroteReport = false;
1189
1191 wroteReport = reportWriter.WriteJsonReport( outPath );
1192 else
1193 wroteReport = reportWriter.WriteTextReport( outPath );
1194
1195 if( !wroteReport )
1196 {
1197 m_reporter->Report( wxString::Format( _( "Unable to save ERC report to %s\n" ), outPath ),
1200 }
1201
1202 m_reporter->Report( wxString::Format( _( "Saved ERC Report to %s\n" ), outPath ),
1204
1205 if( ercJob->m_exitCodeViolations )
1206 {
1207 if( markersProvider->GetCount() > 0 )
1209 }
1210
1212}
1213
1214
1216{
1217 JOB_SCH_UPGRADE* aUpgradeJob = dynamic_cast<JOB_SCH_UPGRADE*>( aJob );
1218
1219 if( aUpgradeJob == nullptr )
1221
1222 SCHEMATIC* sch = getSchematic( aUpgradeJob->m_filename );
1223
1224 if( !sch )
1226
1227 bool shouldSave = aUpgradeJob->m_force;
1228
1230 shouldSave = true;
1231
1232 if( !shouldSave )
1233 {
1234 m_reporter->Report( _( "Schematic file was not updated\n" ), RPT_SEVERITY_ERROR );
1236 }
1237
1238 // needs an absolute path
1239 wxFileName schPath( aUpgradeJob->m_filename );
1240 schPath.MakeAbsolute();
1241 const wxString schFullPath = schPath.GetFullPath();
1242
1243 try
1244 {
1245 IO_RELEASER<SCH_IO> pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_KICAD ) );
1246 SCH_SHEET* loadedSheet = pi->LoadSchematicFile( schFullPath, sch );
1247 pi->SaveSchematicFile( schFullPath, loadedSheet, sch );
1248 }
1249 catch( const IO_ERROR& ioe )
1250 {
1251 wxString msg =
1252 wxString::Format( _( "Error saving schematic file '%s'.\n%s" ), schFullPath, ioe.What().GetData() );
1253 m_reporter->Report( msg, RPT_SEVERITY_ERROR );
1255 }
1256
1257 m_reporter->Report( _( "Successfully saved schematic file using the latest format\n" ), RPT_SEVERITY_INFO );
1258
1260}
1261
1262
1264{
1265 DS_PROXY_VIEW_ITEM* drawingSheet =
1267 &aSch->Project(), &aSch->RootScreen()->GetTitleBlock(),
1268 aSch->GetProperties() );
1269
1270 drawingSheet->SetPageNumber( TO_UTF8( aSch->RootScreen()->GetPageNumber() ) );
1271 drawingSheet->SetSheetCount( aSch->RootScreen()->GetPageCount() );
1272 drawingSheet->SetFileName( TO_UTF8( aSch->RootScreen()->GetFileName() ) );
1275 drawingSheet->SetIsFirstPage( aSch->RootScreen()->GetVirtualPageNumber() == 1 );
1276
1277 drawingSheet->SetSheetName( "" );
1278 drawingSheet->SetSheetPath( "" );
1279
1280 return drawingSheet;
1281}
const char * name
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
int GetPageCount() const
Definition base_screen.h:72
int GetVirtualPageNumber() const
Definition base_screen.h:75
const wxString & GetPageNumber() const
constexpr size_type GetWidth() const
Definition box2.h:214
constexpr const Vec GetCenter() const
Definition box2.h:230
constexpr size_type GetHeight() const
Definition box2.h:215
Color settings are a bit different than most of the settings objects in that there can be more than o...
int ShowModal() override
static DS_DATA_MODEL & GetTheInstance()
Return the instance of DS_DATA_MODEL used in the application.
void SetSheetPath(const std::string &aSheetPath)
Set the sheet path displayed in the title block.
void SetSheetCount(int aSheetCount)
Change the sheet-count number displayed in the title block.
void SetPageNumber(const std::string &aPageNumber)
Change the page number displayed in the title block.
void SetSheetName(const std::string &aSheetName)
Set the sheet name displayed in the title block.
void SetPageBorderColorLayer(int aLayerId)
Override the layer used to pick the color of the page border (normally LAYER_GRID)
void SetIsFirstPage(bool aIsFirstPage)
Change if this is first page.
void SetFileName(const std::string &aFileName)
Set the file name displayed in the title block.
void SetColorLayer(int aLayerId)
Can be used to override which layer ID is used for drawing sheet item colors.
static SCHEMATIC * LoadSchematic(const wxString &aFileName, bool aSetActive, bool aForceDefaultProject, PROJECT *aProject=nullptr, bool aCalculateConnectivity=true)
void InitRenderSettings(SCH_RENDER_SETTINGS *aRenderSettings, const wxString &aTheme, SCHEMATIC *aSch, const wxString &aDrawingSheetOverride=wxEmptyString)
Configure the SCH_RENDER_SETTINGS object with the correct data to be used with plotting.
SCHEMATIC * getSchematic(const wxString &aPath)
DS_PROXY_VIEW_ITEM * getDrawingSheetProxyView(SCHEMATIC *aSch)
int doSymExportSvg(JOB_SYM_EXPORT_SVG *aSvgJob, SCH_RENDER_SETTINGS *aRenderSettings, LIB_SYMBOL *symbol)
bool WriteJsonReport(const wxString &aFullFileName)
Writes a JSON formatted ERC Report to the given file path in the c-locale.
bool WriteTextReport(const wxString &aFullFileName)
Writes the text report also available via GetTextReport directly to a given file path.
void RunTests(DS_PROXY_VIEW_ITEM *aDrawingSheet, SCH_EDIT_FRAME *aEditFrame, KIFACE *aCvPcb, PROJECT *aProject, PROGRESS_REPORTER *aProgressReporter)
Definition erc.cpp:1858
void ApplyBomPreset(const BOM_PRESET &preset, const std::set< wxString > &aVariantNames)
void AddColumn(const wxString &aFieldName, const wxString &aLabel, bool aAddedByUser, const std::set< wxString > &aVariantNames)
wxString Export(const BOM_FMT_PRESET &settings)
std::vector< BOM_FIELD > GetFieldsOrdered()
Provide an extensible class to resolve 3D model paths.
wxString ResolvePath(const wxString &aFileName, const wxString &aWorkingPath, std::vector< const EMBEDDED_FILES * > aEmbeddedFilesStack)
Determine the full path of the given file name.
void SetProgramBase(PGM_BASE *aBase)
Set a pointer to the application's PGM_BASE instance used to extract the local env vars.
bool SetProject(const PROJECT *aProject, bool *flgChanged=nullptr)
Set the current KiCad project directory as the first entry in the model path list.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
void Register(const std::string &aJobTypeName, std::function< int(JOB *job)> aHandler, std::function< bool(JOB *job, wxWindow *aParent)> aConfigHandler)
JOB_DISPATCHER(KIWAY *aKiway)
PROGRESS_REPORTER * m_progressReporter
REPORTER * m_reporter
std::vector< wxString > m_fieldsLabels
std::vector< wxString > m_fieldsOrdered
std::vector< wxString > m_fieldsGroupBy
JOB_PAGE_SIZE m_pageSizeSelect
SCH_PLOT_FORMAT m_plotFormat
std::vector< wxString > m_plotPages
bool m_exitCodeViolations
Definition job_rc.h:52
int m_severity
Definition job_rc.h:49
UNITS m_units
Definition job_rc.h:48
OUTPUT_FORMAT m_format
Definition job_rc.h:50
wxString m_filename
Definition job_rc.h:47
wxString m_outputLibraryPath
An simple container class that lets us dispatch output jobs to kifaces.
Definition job.h:183
void SetConfiguredOutputPath(const wxString &aPath)
Sets the configured output path for the job, this path is always saved to file.
Definition job.cpp:153
wxString GetFullOutputPath(PROJECT *aProject) const
Returns the full output path for the job, taking into account the configured output path,...
Definition job.cpp:100
bool GetOutputPathIsDirectory() const
Definition job.h:253
wxString GetConfiguredOutputPath() const
Returns the configured output path for the job.
Definition job.h:232
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
Definition job.h:203
const std::map< wxString, wxString > & GetVarOverrides() const
Definition job.h:196
void SetDefaultPenWidth(int aWidth)
void SetGapLengthRatio(double aRatio)
void SetDashLengthRatio(double aRatio)
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition kiway.h:292
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition kiway.cpp:403
@ FACE_CVPCB
Definition kiway.h:301
Define a library symbol object.
Definition lib_symbol.h:85
const BOX2I GetUnitBoundingBox(int aUnit, int aBodyStyle, bool aIgnoreHiddenFields=true, bool aIgnoreLabelsOnInvisiblePins=true) const
Get the bounding box for the symbol.
bool IsDerived() const
Definition lib_symbol.h:206
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
void PlotFields(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed)
Plot symbol fields.
std::shared_ptr< LIB_SYMBOL > GetRootSymbol() const
Get the parent symbol that does not have another parent.
wxString GetName() const override
Definition lib_symbol.h:148
const std::vector< wxString > & GetBodyStyleNames() const
Definition lib_symbol.h:763
bool HasDeMorganBodyStyles() const override
Definition lib_symbol.h:760
int GetBodyStyleCount() const override
Definition lib_symbol.h:752
int GetUnitCount() const override
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition locale_io.h:41
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition page_info.h:79
int GetHeightIU(double aIUScale) const
Gets the page height in IU.
Definition page_info.h:168
void SetHeightMils(double aHeightInMils)
int GetWidthIU(double aIUScale) const
Gets the page width in IU.
Definition page_info.h:159
void SetWidthMils(double aWidthInMils)
static bool EnsurePathExists(const wxString &aPath, bool aPathToFile=false)
Attempts to create a given path if it does not exist.
Definition paths.cpp:477
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:128
virtual bool OpenFile(const wxString &aFullFilename)
Open or create the plot file aFullFilename.
Definition plotter.cpp:76
virtual void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition plotter.h:154
void SetRenderSettings(RENDER_SETTINGS *aSettings)
Definition plotter.h:151
virtual void SetCreator(const wxString &aCreator)
Definition plotter.h:173
virtual void SetColorMode(bool aColorMode)
Plot in B/W or color.
Definition plotter.h:148
static SYMBOL_LIBRARY_ADAPTER * SymbolLibAdapter(PROJECT *aProject)
Accessor for project symbol library manager adapter.
Container for project specific data.
Definition project.h:66
virtual void ApplyTextVars(const std::map< wxString, wxString > &aVarsMap)
Applies the given var map, it will create or update existing vars.
Definition project.cpp:120
std::vector< BOM_PRESET > m_BomPresets
std::vector< BOM_FMT_PRESET > m_BomFmtPresets
Holds all the data relating to one schematic.
Definition schematic.h:88
wxString GetFileName() const
Helper to retrieve the filename from the root sheet screen.
SCHEMATIC_SETTINGS & Settings() const
SCH_SHEET_LIST Hierarchy() const
Return the full schematic flattened hierarchical sheet list.
PROJECT & Project() const
Return a reference to the project this schematic is part of.
Definition schematic.h:103
EMBEDDED_FILES * GetEmbeddedFiles() override
SCH_SCREEN * RootScreen() const
Helper to retrieve the screen of the root sheet.
const std::map< wxString, wxString > * GetProperties()
Definition schematic.h:106
Schematic editor (Eeschema) main window.
SCHEMATIC & Schematic() const
A cache assistant for the KiCad s-expression symbol libraries.
void Save(const std::optional< bool > &aOpt=std::nullopt) override
Save the entire library to file m_libFileName;.
virtual LIB_SYMBOL * GetSymbol(const wxString &aName)
void SetFileName(const wxString &aFileName)
const LIB_SYMBOL_MAP & GetSymbolMap() const
void SetModified(bool aModified=true)
static bool ConvertLibrary(std::map< std::string, UTF8 > *aOldFileProps, const wxString &aOldFilePath, const wxString &aNewFilepath)
Convert a schematic symbol library to the latest KiCad format.
static SCH_FILE_T GuessPluginTypeFromLibPath(const wxString &aLibPath, int aCtl=0)
Return a plugin type given a symbol library using the file extension of aLibPath.
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
int CheckAnnotation(ANNOTATION_ERROR_HANDLER aErrorHandler)
Check for annotations errors.
A helper to define a symbol's reference designator in a schematic.
void LoadColors(const COLOR_SETTINGS *aSettings) override
const PAGE_INFO & GetPageSettings() const
Definition sch_screen.h:139
const wxString & GetFileName() const
Definition sch_screen.h:152
int GetFileFormatVersionAtLoad() const
Definition sch_screen.h:137
const TITLE_BLOCK & GetTitleBlock() const
Definition sch_screen.h:163
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition sch_sheet.h:47
Schematic symbol object.
Definition sch_symbol.h:76
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
PROJECT & Prj() const
A helper while we are not MDI-capable – return the one and only project.
virtual bool StartPlot(const wxString &aPageNumber) override
Create SVG file header.
virtual void SetViewport(const VECTOR2I &aOffset, double aIusPerDecimil, double aScale, bool aMirror) override
Set the plot offset and scaling for the current plot.
virtual bool EndPlot() override
An interface to the global shared library manager that is schematic-specific and linked to one projec...
void AsyncLoad() override
Loads all available libraries for this adapter type in the background.
const std::vector< TEMPLATE_FIELDNAME > & GetTemplateFieldNames()
Return a template field name list for read only access.
wxString GetGeneratedFieldDisplayName(const wxString &aSource)
Returns any variables unexpanded, e.g.
Definition common.cpp:124
bool IsGeneratedField(const wxString &aSource)
Returns true if the string is generated, e.g contains a single text var reference.
Definition common.cpp:137
The common library.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:202
This file is part of the common library.
#define DEFAULT_LINE_WIDTH_MILS
The default wire width in mils. (can be changed in preference menu)
#define _(s)
EDA_UNITS
Definition eda_units.h:48
ERCE_T
ERC error codes.
@ FRAME_SCH
Definition frame_type.h:34
static const std::string CadstarNetlistFileExtension
static const std::string NetlistFileExtension
static const std::string ReportFileExtension
static const std::string JsonFileExtension
static const std::string XmlFileExtension
static const std::string KiCadSchematicFileExtension
static const std::string OrCadPcb2NetlistFileExtension
static const std::string CsvFileExtension
static const std::string SpiceFileExtension
static const std::string SVGFileExtension
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
Definition io_mgr.h:33
#define KICAD_FONT_NAME
@ LAYER_SCHEMATIC_DRAWINGSHEET
Definition layer_ids.h:496
@ LAYER_SCHEMATIC_PAGE_LIMITS
Definition layer_ids.h:497
static const int ERR_ARGS
Definition exit_codes.h:31
static const int OK
Definition exit_codes.h:30
static const int ERR_RC_VIOLATIONS
Rules check violation count was greater than 0.
Definition exit_codes.h:37
static const int ERR_INVALID_INPUT_FILE
Definition exit_codes.h:33
static const int SUCCESS
Definition exit_codes.h:29
static const int ERR_INVALID_OUTPUT_CONFLICT
Definition exit_codes.h:34
static const int ERR_UNKNOWN
Definition exit_codes.h:32
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition kicad_algo.h:100
@ GNL_OPT_BOM
SETTINGS_MANAGER * GetSettingsManager()
PGM_BASE & Pgm()
The global program "get" accessor.
Definition pgm_base.cpp:946
see class PGM_BASE
PLOT_FORMAT
The set of supported output plot formats.
Definition plotter.h:64
Plotting engines similar to ps (PostScript, Gerber, svg)
@ RPT_SEVERITY_WARNING
@ RPT_SEVERITY_ERROR
@ RPT_SEVERITY_INFO
@ RPT_SEVERITY_ACTION
#define SEXPR_SYMBOL_LIB_FILE_VERSION
This file contains the file format version information for the s-expression schematic and symbol libr...
#define SEXPR_SCHEMATIC_FILE_VERSION
Schematic file version.
@ PAGE_SIZE_AUTO
Definition sch_plotter.h:48
@ PAGE_SIZE_A
Definition sch_plotter.h:50
@ PAGE_SIZE_A4
Definition sch_plotter.h:49
COLOR_SETTINGS * GetColorSettings(const wxString &aName)
T * GetAppSettings(const char *aFilename)
const int scale
MODEL3D_FORMAT_TYPE fileType(const char *aFileName)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
wxString label
wxString name
wxString fieldDelimiter
static std::vector< BOM_FMT_PRESET > BuiltInPresets()
wxString stringDelimiter
wxString refRangeDelimiter
wxString refDelimiter
wxString sortField
bool groupSymbols
std::vector< BOM_FIELD > fieldsOrdered
static std::vector< BOM_PRESET > BuiltInPresets()
bool excludeDNP
wxString filterString
std::vector< wxString > m_plotPages
Definition sch_plotter.h:58
wxString m_theme
Definition sch_plotter.h:67
DXF_UNITS m_DXF_File_Unit
Definition sch_plotter.h:72
bool m_PDFPropertyPopups
Definition sch_plotter.h:64
wxString m_outputDirectory
Definition sch_plotter.h:69
wxString m_outputFile
Definition sch_plotter.h:70
bool m_blackAndWhite
Definition sch_plotter.h:61
bool m_PDFHierarchicalLinks
Definition sch_plotter.h:65
bool m_useBackgroundColor
Definition sch_plotter.h:63
bool m_plotDrawingSheet
Definition sch_plotter.h:57
Hold a name of a symbol's field, field value, and default visibility.
std::map< wxString, LIB_SYMBOL *, LibSymbolMapSort > LIB_SYMBOL_MAP
wxString GetDefaultFieldName(FIELD_T aFieldId, bool aTranslateForHI)
Return a default symbol field name for a mandatory field type.
#define DO_TRANSLATE
#define MANDATORY_FIELDS
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
wxString GetCanonicalFieldName(FIELD_T aFieldType)
VECTOR3I res
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695
Definition of file extensions used in Kicad.