void test1() { QAxObject excel( "Excel.Application", 0); excel.setProperty("Visible", true); QAxObjectPtr workbooks(excel.querySubObject("Workbooks")); QAxObjectPtr workbook(workbooks->querySubObject("Add()")); QAxObjectPtr sheets(workbook->querySubObject("Worksheets")); sheets->dynamicCall("Add()"); QAxObjectPtr sheet(sheets->querySubObject( "Item( int )", 1 )); // sheet->setProperty("Name","Nova Planilha"); QAxObjectPtr range(sheet->querySubObject("Cells(int,int)",1,1)); range->setProperty("Value", QVariant(1234)); QImage image("c:/Users/jhlee/Dropbox/orgwiki/img/class01.png"); QClipboard* clip = QApplication::clipboard(); clip->setImage(image); QAxObjectPtr shapes(sheet->querySubObject("Shapes")); sheet->dynamicCall("Paste()"); int shapeCount = shapes->property("Count").toInt(); QAxObjectPtr shape(shapes->querySubObject(QString::fromLatin1("Item(%1)").arg(shapeCount).toAscii())); // shapes->dynamicCall("AddPicture( QString&, bool, bool, double, double, double, double","c:\\Users\\jhlee\\Dropbox\\orgwiki\\img\\class01.png",true,true,100,100,70,70); excel.setProperty("DisplayAlerts", false); workbook->dynamicCall("SaveAs(QString&)", "c:\\temp\\testexcel.xlsx"); // //workbook->dynamicCall("Close()"); // //excel.dynamicCall("Quit()"); // workbook->dynamicCall("Close (Boolean)", true); excel.dynamicCall("Quit()"); }
bool SCH_EDIT_FRAME::prepareForNetlist() { SCH_SHEET_LIST sheets( g_RootSheet ); sheets.AnnotatePowerSymbols( Prj().SchLibs() ); // Performs some controls: if( CheckAnnotate( NULL, 0 ) ) { // Schematic must be annotated: call Annotate dialog and tell // the user why that is. InvokeDialogAnnotate( this, _( "Exporting the netlist requires a " "completely\nannotated schematic." ) ); if( CheckAnnotate( NULL, 0 ) ) return false; } // Test duplicate sheet names: if( TestDuplicateSheetNames( false ) > 0 ) { if( !IsOK( NULL, _( "Error: duplicate sheet names. Continue?" ) ) ) return false; } // Cleanup the entire hierarchy SCH_SCREENS screens; screens.SchematicCleanUp(); return true; }
/** * Load component data from the entire schematic set */ void DIALOG_BOM_EDITOR::LoadComponents() { if( !m_parent ) return; // List of component objects SCH_REFERENCE_LIST refs; // Generate a list of schematic sheets SCH_SHEET_LIST sheets( g_RootSheet ); sheets.GetComponents( m_parent->Prj().SchLibs(), refs, false ); // Pass the references through to the model m_bom->SetComponents( refs ); }
void mapExistingAnnotation( std::map<timestamp_t, wxString>& aMap ) { SCH_SHEET_LIST sheets( g_RootSheet ); SCH_REFERENCE_LIST references; sheets.GetComponents( references ); for( size_t i = 0; i < references.GetCount(); i++ ) { SCH_COMPONENT* comp = references[ i ].GetComp(); wxString ref = comp->GetField( REFERENCE )->GetFullyQualifiedText(); if( !ref.Contains( wxT( "?" ) ) ) aMap[ comp->GetTimeStamp() ] = ref; } }
ustring stylesheet_get_actual () // Gets the actual stylesheet. { // TO DO: This routine is called A LOT. Why not just cache the result as currStylesheet // and only change it if the user changes it? //DEBUG("Getting stylesheet") // Get the stylesheet from the configuration, with a fallback. extern Settings * settings; ustring sheet = settings->genconfig.stylesheet_get(); if (sheet.empty()) { sheet = STANDARDSHEET; } //DEBUG(sheet) // See whether it exists. vector < ustring > stylesheets; stylesheet_get_ones_available(stylesheets); set < ustring > sheets(stylesheets.begin(), stylesheets.end()); // Sheet is there? Fine. if (sheets.find(sheet) != sheets.end()) { } // Sheets is not there - take Standard, if it's around. else if (sheets.find(STANDARDSHEET) != sheets.end()) { sheet = STANDARDSHEET; } // Else take first sheet in the list, if it is there. else { if (!stylesheets.empty()) { sheet = stylesheets[0]; } } // Return sheet. return sheet; }
void SCH_EDIT_FRAME::backAnnotateFootprints( const std::string& aChangedSetOfReferences ) throw( IO_ERROR, boost::bad_pointer ) { // Build a flat list of components in schematic: SCH_REFERENCE_LIST refs; SCH_SHEET_LIST sheets( g_RootSheet ); bool isChanged = false; sheets.GetComponents( Prj().SchLibs(), refs, false ); DSNLEXER lexer( aChangedSetOfReferences, FROM_UTF8( __func__ ) ); PTREE doc; try { Scan( &doc, &lexer ); #if defined(DEBUG) && 0 STRING_FORMATTER sf; Format( &sf, 0, 0, doc ); printf( "%s: '%s'\n", __func__, sf.GetString().c_str() ); #endif CPTREE& back_anno = doc.get_child( "back_annotation" ); wxString footprint; for( PTREE::const_iterator ref = back_anno.begin(); ref != back_anno.end(); ++ref ) { wxASSERT( ref->first == "ref" ); wxString reference = (UTF8&) ref->second.front().first; // Ensure the "fpid" node contains a footprint name, // and get it if exists if( ref->second.get_child( "fpid" ).size() ) { wxString tmp = (UTF8&) ref->second.get_child( "fpid" ).front().first; footprint = tmp; } else footprint.Empty(); // DBG( printf( "%s: ref:%s fpid:%s\n", __func__, TO_UTF8( reference ), TO_UTF8( footprint ) ); ) // Search the component in the flat list for( unsigned ii = 0; ii < refs.GetCount(); ++ii ) { if( reference == refs[ii].GetRef() ) { // We have found a candidate. // Note: it can be not unique (multiple parts per package) // So we *do not* stop the search here SCH_COMPONENT* component = refs[ii].GetComp(); SCH_FIELD* fpfield = component->GetField( FOOTPRINT ); const wxString& oldfp = fpfield->GetText(); if( !oldfp && fpfield->IsVisible() ) { fpfield->SetVisible( false ); } // DBG( printf("%s: ref:%s fpid:%s\n", __func__, TO_UTF8( refs[ii].GetRef() ), TO_UTF8( footprint ) );) if( oldfp != footprint ) isChanged = true; fpfield->SetText( footprint ); } } } } catch( const PTREE_ERROR& ex ) { // remap the exception to something the caller is likely to understand. THROW_IO_ERROR( ex.what() ); } if( isChanged ) OnModify(); }
/** @param nc The Glint22 configuration file */ void GCMCoupler::read_from_netcdf( std::string const &fname, std::string const &vname, std::unique_ptr<GridDomain> &&mdomain) { printf("BEGIN GCMCoupler::read_from_netcdf()\n"); NcFile nc(fname.c_str(), NcFile::ReadOnly); this->fname = fname; this->vname = vname; // Load the MatrixMaker (filtering by our domain, of course) // Also load the ice sheets maker.reset(new MatrixMaker(true, std::move(mdomain))); maker->read_from_netcdf(nc, vname); // The root node needs to make the full regridding matrices, not just those // for its own domain. Therefore, create a second MatrixMaker for it. if (am_i_root()) { maker_full.reset(new MatrixMaker(true, std::unique_ptr<GridDomain>(new GridDomain_Identity()))); maker_full->read_from_netcdf(nc, vname); } std::vector<std::string> const &sheet_names(maker->get_sheet_names()); giss::MapDict<std::string, IceSheet> &sheets(maker->sheets); // Read gcm_out_file, an optional variable telling the GCM-specific // part of GLINT2 to write out exactly what it sees coming from the GCM // (so it can be replayed later with desm) { NcVar *info_var = giss::get_var_safe(nc, vname + ".info"); auto attr(giss::get_att(info_var, "gcm_out_file")); if (!attr.get()) { gcm_out_file = ""; } else { gcm_out_file = attr->as_string(0); if (gcm_out_file.length() > 0) { gcm_out_file = boost::filesystem::absolute( boost::filesystem::path(gcm_out_file), gcm_params.config_dir).string(); } } printf("gcm_out_file = %s\n", gcm_out_file.c_str()); } // Read gcm_in_file, an optional variable telling the GCM-specific // part of GLINT2 to write out exactly what it sees coming from the GCM // (so it can be replayed later with desm) { NcVar *info_var = giss::get_var_safe(nc, vname + ".info"); auto attr(giss::get_att(info_var, "gcm_in_file")); if (!attr.get()) { gcm_in_file = ""; } else { gcm_in_file = attr->as_string(0); if (gcm_in_file.length() > 0) { gcm_in_file = boost::filesystem::absolute( boost::filesystem::path(gcm_in_file), gcm_params.config_dir).string(); } } printf("gcm_in_file = %s\n", gcm_in_file.c_str()); } #if 1 std::cout << "========= GCM Constants" << std::endl; int ix=0; for (auto field = gcm_constants.begin(); field != gcm_constants.end(); ++field, ++ix) { std::cout << " " << *field << " = " << gcm_constants[ix] << std::endl; } std::cout << "========= GCM Outputs" << std::endl; std::cout << gcm_outputs << std::endl; std::cout << "========= GCM Inputs (first time around)" << std::endl; std::cout << gcm_inputs << std::endl; #endif int i = 0; for (auto name = sheet_names.begin(); name != sheet_names.end(); ++name) { std::string vname_sheet = vname + "." + *name; // Create an IceModel corresponding to this IceSheet. IceSheet *sheet = sheets[*name]; models.insert(sheet->index, read_icemodel(*name, this, nc, vname_sheet, read_gcm_per_ice_sheet_params(nc, vname_sheet), sheet)); IceModel *ice_model = models[i]; // Set up the contracts specifying the variables to be passed // between the GCM and the ice model. This contract is specific // to both the GCM and the ice model. Note that setup_contracts() // is a virtual method. // This code MUST call GCMCoupler::setup_contracts() somewhere inside. ice_model->init(sheet->grid2, nc, vname_sheet); ice_model->update_ice_sheet(nc, vname_sheet, sheet); // Check the contract for errors giss::CouplingContract const &ocontract(ice_model->contract[IceModel::OUTPUT]); int nfields = ocontract.size_nounit(); for (int i=0; i<nfields; ++i) { giss::CoupledField const &cf(ocontract.field(i)); if ((cf.flags & contracts::GRID_BITS) == contracts::ICE) { fprintf(stderr, "ERROR: Ice model outputs must be all on the ice grid, field %s is not\n", cf.name.c_str()); throw std::exception(); } } // ---- Create the affiliated writers // Writer for ice model input std::unique_ptr<IceModel_Writer> iwriter(new IceModel_Writer(*name, IceModel::INPUT, this)); iwriter->init(sheet->grid2, ice_model); // Writer for ice model output std::unique_ptr<IceModel_Writer> owriter(new IceModel_Writer(*name, IceModel::OUTPUT, this)); owriter->init(sheet->grid2, ice_model); ice_model->set_writers(std::move(iwriter), std::move(owriter)); ++i; } nc.close(); printf("END GCMCoupler::read_from_netcdf()\n"); }
void DIALOG_ERC::TestErc( wxArrayString* aMessagesList ) { wxFileName fn; m_writeErcFile = m_WriteResultOpt->GetValue(); m_TestSimilarLabels = m_cbTestSimilarLabels->GetValue(); m_tstUniqueGlobalLabels = m_cbTestUniqueGlbLabels->GetValue(); // Build the whole sheet list in hierarchy (sheet, not screen) SCH_SHEET_LIST sheets( g_RootSheet ); sheets.AnnotatePowerSymbols( Prj().SchLibs() ); if( m_parent->CheckAnnotate( aMessagesList, false ) ) { if( aMessagesList ) { wxString msg = _( "Annotation required!" ); msg += wxT( "\n" ); aMessagesList->Add( msg ); } return; } SCH_SCREENS screens; // Erase all previous DRC markers. screens.DeleteAllMarkers( MARKER_BASE::MARKER_ERC ); for( SCH_SCREEN* screen = screens.GetFirst(); screen != NULL; screen = screens.GetNext() ) { /* Ff wire list has changed, delete Undo Redo list to avoid pointers on deleted * data problems. */ if( screen->SchematicCleanUp() ) screen->ClearUndoRedoList(); } /* Test duplicate sheet names inside a given sheet, one cannot have sheets with * duplicate names (file names can be duplicated). */ TestDuplicateSheetNames( true ); std::auto_ptr<NETLIST_OBJECT_LIST> objectsConnectedList( m_parent->BuildNetListBase() ); // Reset the connection type indicator objectsConnectedList->ResetConnectionsType(); unsigned lastNet; unsigned nextNet = lastNet = 0; int MinConn = NOC; for( unsigned net = 0; net < objectsConnectedList->size(); net++ ) { if( objectsConnectedList->GetItemNet( lastNet ) != objectsConnectedList->GetItemNet( net ) ) { // New net found: MinConn = NOC; nextNet = net; } switch( objectsConnectedList->GetItemType( net ) ) { // These items do not create erc problems case NET_ITEM_UNSPECIFIED: case NET_SEGMENT: case NET_BUS: case NET_JUNCTION: case NET_LABEL: case NET_BUSLABELMEMBER: case NET_PINLABEL: case NET_GLOBBUSLABELMEMBER: break; case NET_HIERLABEL: case NET_HIERBUSLABELMEMBER: case NET_SHEETLABEL: case NET_SHEETBUSLABELMEMBER: // ERC problems when pin sheets do not match hierarchical labels. // Each pin sheet must match a hierarchical label // Each hierarchical label must match a pin sheet objectsConnectedList->TestforNonOrphanLabel( net, nextNet ); break; case NET_GLOBLABEL: if( m_tstUniqueGlobalLabels ) objectsConnectedList->TestforNonOrphanLabel( net, nextNet ); break; case NET_NOCONNECT: // ERC problems when a noconnect symbol is connected to more than one pin. MinConn = NET_NC; if( objectsConnectedList->CountPinsInNet( nextNet ) > 1 ) Diagnose( objectsConnectedList->GetItem( net ), NULL, MinConn, UNC ); break; case NET_PIN: // Look for ERC problems between pins: TestOthersItems( objectsConnectedList.get(), net, nextNet, &MinConn ); break; } lastNet = net; } // Test similar labels (i;e. labels which are identical when // using case insensitive comparisons) if( m_TestSimilarLabels ) objectsConnectedList->TestforSimilarLabels(); // Displays global results: updateMarkerCounts( &screens ); // Display diags: DisplayERC_MarkersList(); // Display new markers: m_parent->GetCanvas()->Refresh(); // Display message wxString msg = _( "Finished" ); msg += wxT( "\n" ); aMessagesList->Add( msg ); if( m_writeErcFile ) { fn = g_RootSheet->GetScreen()->GetFileName(); fn.SetExt( wxT( "erc" ) ); wxFileDialog dlg( this, _( "ERC File" ), fn.GetPath(), fn.GetFullName(), _( "Electronic rule check file (.erc)|*.erc" ), wxFD_SAVE ); if( dlg.ShowModal() == wxID_CANCEL ) return; if( WriteDiagnosticERC( dlg.GetPath() ) ) { Close( true ); ExecuteFile( this, Pgm().GetEditorName(), QuoteFullPath( fn ) ); } } }
void SCH_EDIT_FRAME::AnnotateComponents( bool aAnnotateSchematic, ANNOTATE_ORDER_T aSortOption, ANNOTATE_OPTION_T aAlgoOption, int aStartNumber, bool aResetAnnotation, bool aRepairTimestamps, bool aLockUnits, REPORTER& aReporter ) { SCH_REFERENCE_LIST references; SCH_SCREENS screens; // Build the sheet list. SCH_SHEET_LIST sheets( g_RootSheet ); // Map of locked components SCH_MULTI_UNIT_REFERENCE_MAP lockedComponents; // Map of previous annotation for building info messages std::map<timestamp_t, wxString> previousAnnotation; // Test for and replace duplicate time stamps in components and sheets. Duplicate // time stamps can happen with old schematics, schematic conversions, or manual // editing of files. if( aRepairTimestamps ) { int count = screens.ReplaceDuplicateTimeStamps(); if( count ) { wxString msg; msg.Printf( _( "%d duplicate time stamps were found and replaced." ), count ); aReporter.ReportTail( msg, REPORTER::RPT_WARNING ); } } // If units must be locked, collect all the sets that must be annotated together. if( aLockUnits ) { if( aAnnotateSchematic ) { sheets.GetMultiUnitComponents( lockedComponents ); } else { m_CurrentSheet->GetMultiUnitComponents( lockedComponents ); } } // Store previous annotations for building info messages mapExistingAnnotation( previousAnnotation ); // If it is an annotation for all the components, reset previous annotation. if( aResetAnnotation ) DeleteAnnotation( !aAnnotateSchematic ); // Set sheet number and number of sheets. SetSheetNumberAndCount(); // Build component list if( aAnnotateSchematic ) { sheets.GetComponents( references ); } else { m_CurrentSheet->GetComponents( references ); } // Break full components reference in name (prefix) and number: // example: IC1 become IC, and 1 references.SplitReferences(); switch( aSortOption ) { default: case SORT_BY_X_POSITION: references.SortByXCoordinate(); break; case SORT_BY_Y_POSITION: references.SortByYCoordinate(); break; } bool useSheetNum = false; int idStep = 100; switch( aAlgoOption ) { default: case INCREMENTAL_BY_REF: break; case SHEET_NUMBER_X_100: useSheetNum = true; break; case SHEET_NUMBER_X_1000: useSheetNum = true; idStep = 1000; break; } // Recalculate and update reference numbers in schematic references.Annotate( useSheetNum, idStep, aStartNumber, lockedComponents ); references.UpdateAnnotation(); for( size_t i = 0; i < references.GetCount(); i++ ) { SCH_COMPONENT* comp = references[ i ].GetComp(); wxString prevRef = previousAnnotation[ comp->GetTimeStamp() ]; wxString newRef = comp->GetField( REFERENCE )->GetFullyQualifiedText(); wxString msg; if( prevRef.Length() ) { if( newRef == prevRef ) continue; if( comp->GetUnitCount() > 1 ) msg.Printf( _( "Updated %s (unit %s) from %s to %s" ), GetChars( comp->GetField( VALUE )->GetShownText() ), LIB_PART::SubReference( comp->GetUnit(), false ), GetChars( prevRef ), GetChars( newRef ) ); else msg.Printf( _( "Updated %s from %s to %s" ), GetChars( comp->GetField( VALUE )->GetShownText() ), GetChars( prevRef ), GetChars( newRef ) ); } else { if( comp->GetUnitCount() > 1 ) msg.Printf( _( "Annotated %s (unit %s) as %s" ), GetChars( comp->GetField( VALUE )->GetShownText() ), LIB_PART::SubReference( comp->GetUnit(), false ), GetChars( newRef ) ); else msg.Printf( _( "Annotated %s as %s" ), GetChars( comp->GetField( VALUE )->GetShownText() ), GetChars( newRef ) ); } aReporter.Report( msg, REPORTER::RPT_ACTION ); } // Final control (just in case ... ). if( !CheckAnnotate( aReporter, !aAnnotateSchematic ) ) aReporter.ReportTail( _( "Annotation complete." ), REPORTER::RPT_ACTION ); // Update on screen references, that can be modified by previous calculations: m_CurrentSheet->UpdateAllScreenReferences(); SetSheetNumberAndCount(); SyncView(); GetCanvas()->Refresh(); OnModify(); }