private Dimension GetParam(ModelDoc2 mdl, Feature fDossier, String nomCfg) { Dimension param = null; try { Func <String, String> ExtractNomParam = delegate(String s) { s = s.Replace(CONSTANTES.PREFIXE_REF_DOSSIER + "\"", "").Replace("\"", ""); var t = s.Split('@'); if (t.Length > 2) { return(String.Format("{0}@{1}", t[0], t[1])); } this.LogErreur(new Object[] { "Pas de parametre dans la reference dossier" }); return(""); }; // On recherche si le dossier contient déjà la propriété RefDossier // Si non, on ajoute la propriété au dossier selon le modèle suivant : // P"D1@REPERAGE_DOSSIER@Nom_de_la_piece.SLDPRT" // Si oui, on récupère le nom du paramètre à configurer CustomPropertyManager PM = fDossier.CustomPropertyManager; String val; String result = ""; Boolean wasResolved, link; var r = PM.Get6(CONSTANTES.REF_DOSSIER, false, out val, out result, out wasResolved, out link); String nomParam = ExtractNomParam(val); PM.ePropAdd(CONSTANTES.DESC_DOSSIER, val); val = String.Format("\"SW-CutListItemName@@@{0}@{1}\"", fDossier.Name, mdl.eNomAvecExt()); PM.ePropAdd(CONSTANTES.NOM_DOSSIER, val); param = mdl.Parameter(nomParam); param.SetSystemValue3(0.5 * 0.001, (int)swSetValueInConfiguration_e.swSetValue_InSpecificConfigurations, nomCfg); } catch (Exception e) { this.LogErreur(new Object[] { e }); } return(param); }
internal static HelperResult ImportProperties(SldWorks swApp, BindingSource bindingSource, string path, string configName = "") { Console.WriteLine("Import: path={0}, config={1}", path, configName); if (swApp == null) { return(HelperResult.SLDWORKS_NOT_RUNNING); } string ext = Path.GetExtension(path); swDocumentTypes_e type; if (ext.ToLower().Contains("sldprt")) { type = swDocumentTypes_e.swDocPART; } else if (ext.ToLower().Contains("sldasm")) { type = swDocumentTypes_e.swDocASSEMBLY; } else if (ext.ToLower().Contains("slddrw") && string.IsNullOrEmpty(configName)) { type = swDocumentTypes_e.swDocDRAWING; } else { return(HelperResult.WRONG_ARG); } int Error = 0; int Warning = 0; ModelDoc2 doc; // checking if the document is open if (((ModelDoc2)swApp.ActiveDoc) != null && ((ModelDoc2)swApp.ActiveDoc).GetPathName().ToLower() == path.ToLower()) { doc = (ModelDoc2)swApp.ActiveDoc; } else { doc = swApp.OpenDoc6(path, (int)type, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, configName, ref Error, ref Warning); } if (Error != 0) { return(HelperResult.OPEN_ERROR); } CustomPropertyManager manager = doc.Extension.CustomPropertyManager[configName]; if (manager == null) { return(HelperResult.OPEN_ERROR); } string[] names = manager.GetNames(); if (names == null || !names.Any()) { return(HelperResult.NOT_EXIST); } BindingList <PropertyObject> list = new BindingList <PropertyObject>(); foreach (string field in names) { PropertyObject obj = new PropertyObject(); obj.FieldName = field; int ret = manager.Get6(field, true, out string ValOut, out string ResolvedValOut, out bool WasResolved, out bool LinkToProperty); if (ret == (int)swCustomInfoGetResult_e.swCustomInfoGetResult_NotPresent) { continue; } obj.Value = ValOut; list.Add(obj); } if (!list.Any()) { return(HelperResult.NOT_EXIST); } bindingSource.Clear(); bindingSource.DataSource = list; return(HelperResult.SUCCESS); }
private void IndiceMax() { eTypeCorps Filtre = eTypeCorps.Barre | eTypeCorps.Tole; var ListeComposants = MdlBase.ListerComposants(false); Func <Feature, Tuple <String, String> > ExtractRef = delegate(Feature dossier) { CustomPropertyManager PM = dossier.CustomPropertyManager; String val, result = ""; Boolean wasResolved, link; var r = PM.Get6(CONSTANTES.REF_DOSSIER, false, out val, out result, out wasResolved, out link); return(new Tuple <String, String>(result.Replace(CONSTANTES.PREFIXE_REF_DOSSIER, ""), val)); }; Predicate <Feature> Test = delegate(Feature f) { BodyFolder dossier = f.GetSpecificFeature2(); if (dossier.IsRef() && dossier.eNbCorps() > 0 && Filtre.HasFlag(dossier.eTypeDeDossier())) { CustomPropertyManager PM = f.CustomPropertyManager; String val, result = ""; Boolean wasResolved, link; var r = PM.Get6(CONSTANTES.REF_DOSSIER, false, out val, out result, out wasResolved, out link); var RefDossier = ExtractRef(f).Item1; if (RefDossier.eIsInteger()) { return(true); } } return(false); }; foreach (var mdl in ListeComposants.Keys) { mdl.eActiver(swRebuildOnActivation_e.swRebuildActiveDoc); foreach (var t in ListeComposants[mdl]) { var cfg = t.Key; var nbCfg = t.Value; mdl.ShowConfiguration2(cfg); mdl.EditRebuild3(); var Piece = mdl.ePartDoc(); foreach (var f in Piece.eListeDesFonctionsDePiecesSoudees(Test)) { var RefDossier = ExtractRef(f); indice = Math.Max(indice, RefDossier.Item1.eToInteger()); var hashDossier = HashDossier(mdl, f); DossierTraite.Add(hashDossier); // On recherche l'index max pour chaque modele var NomParam = ExtractNomParam(RefDossier.Item2); var dim = NomParam.Split('@')[0].CleanStringOfNonDigits().eToInteger(); var hashMdl = mdl.GetPathName(); if (IndexDimension.ContainsKey(hashMdl)) { IndexDimension[hashMdl] = Math.Max(IndexDimension[hashMdl], dim); } else { IndexDimension[hashMdl] = dim; } } } mdl.eFermerSiDifferent(MdlBase); } WindowLog.EcrireF("Indice Max : {0}", indice); }
/// <summary> /// Pour pouvoir obtenir une référence unique pour chaque dossier de corps, identiques /// dans l'assemblage, on passe par la création d'une propriété dans chaque dossier. /// Cette propriété est liée à une cote dans une esquisse dont la valeur est égale au repère. /// Suivant la configuration, la valeur de la cote peut changer et donc le repère du dossier. /// C'est le seul moyen pour avoir un lien entre les dossiers et la configuration du modèle. /// Les propriétés des dossiers ne sont pas configurables. /// </summary> protected override void Command() { try { if (MajDossiers) { IndiceMax(); } var ListeCorps = new List <Corps>(); var lst = MdlBase.ListerComposants(false); foreach (var mdl in lst.Keys) { mdl.eActiver(swRebuildOnActivation_e.swRebuildActiveDoc); EsquisseRepere(mdl); foreach (var cfg in lst[mdl].Keys) { mdl.ShowConfiguration2(cfg); mdl.EditRebuild3(); WindowLog.SautDeLigne(); WindowLog.EcrireF("{0} \"{1}\"", mdl.eNomSansExt(), cfg); var piece = mdl.ePartDoc(); var NbConfig = lst[mdl][cfg]; var ListeDossier = piece.eListeDesFonctionsDePiecesSoudees( swD => { BodyFolder Dossier = swD.GetSpecificFeature2(); // Si le dossier est la racine d'un sous-ensemble soudé, il n'y a rien dedans if (Dossier.IsRef() && Dossier.eNbCorps() > 0 && (eTypeCorps.Barre | eTypeCorps.Tole).HasFlag(Dossier.eTypeDeDossier())) { return(true); } return(false); } ); foreach (var fDossier in ListeDossier) { BodyFolder Dossier = fDossier.GetSpecificFeature2(); CustomPropertyManager PM = fDossier.CustomPropertyManager; // Si MajDossier et PropExiste, ne pas mettre à jour Boolean Maj = !(MajDossiers && PM.ePropExiste(CONSTANTES.REF_DOSSIER)); String NomParam = ""; WindowLog.EcrireF(" {0}", fDossier.Name); // On recherche si le dossier à déjà été traité. // Si non, on ajoute le dossier à la liste // On met à jour la liste des index des dimensions : // On ajoute le nom du modele et on itiniatile l'index à 1 // Ou, puisque c'est un nouveau dossier, on ajoute un à l'index existant. // On créer le nom du paramètre // On ajoute la propriété au dossier selon le modèle suivant : // P"D1@REPERAGE_DOSSIER@Nom_de_la_piece.SLDPRT" // Si oui, on récupère le nom du paramètre var clef = HashDossier(mdl, fDossier); if (!DossierTraite.Contains(clef)) { DossierTraite.Add(clef); IndexDimension.AddIfNotExistOrPlus(mdl.GetPathName()); NomParam = String.Format("D{0}@{1}", IndexDimension[mdl.GetPathName()]++, CONSTANTES.NOM_ESQUISSE_NUMEROTER); var propVal = String.Format("{0}\"{1}@{2}\"", CONSTANTES.PREFIXE_REF_DOSSIER, NomParam, mdl.eNomAvecExt()); var r = PM.ePropAdd(CONSTANTES.REF_DOSSIER, propVal); if (r > 0) { WindowLog.EcrireF("{0}-{1}-{2} : Pas de propriété ajoutée {3}", mdl.eNomSansExt(), cfg, fDossier.Name, (swCustomInfoAddResult_e)r); } PM.ePropAdd(CONSTANTES.DESC_DOSSIER, propVal); } else { String val, result = ""; Boolean wasResolved, link; var r = PM.Get6(CONSTANTES.REF_DOSSIER, false, out val, out result, out wasResolved, out link); if (r == 1) { WindowLog.EcrireF("{0}-{1}-{2} : Pas de propriété {3}", mdl.eNomSansExt(), cfg, fDossier.Name, (swCustomInfoGetResult_e)r); } NomParam = ExtractNomParam(val); } { String val, result = ""; Boolean wasResolved, link; var r = PM.Get6(CONSTANTES.REF_DOSSIER, false, out val, out result, out wasResolved, out link); PM.ePropAdd(CONSTANTES.DESC_DOSSIER, val); } // On ajoute la propriété NomDossier // permettant de récupérer le nom du dossier dans la mise en plan if (!PM.ePropExiste(CONSTANTES.NOM_DOSSIER)) { var propVal = String.Format("\"SW-CutListItemName@@@{0}@{1}\"", fDossier.Name, mdl.eNomAvecExt()); PM.ePropAdd(CONSTANTES.NOM_DOSSIER, propVal); } var SwCorps = Dossier.ePremierCorps(); Boolean Ajoute = false; var MateriauCorps = SwCorps.eGetMateriauCorpsOuPiece(piece, cfg); var nbCorps = Dossier.eNbCorps() * NbConfig; Dimension param = mdl.Parameter(NomParam); eTypeCorps TypeCorps = Dossier.eTypeDeDossier(); if (CombinerCorpsIdentiques) { // On recherche s'il existe des corps identiques // Si oui, on applique le même repère au parametre foreach (var CorpsTest in ListeCorps) { if ((MateriauCorps != CorpsTest.Materiau) || (TypeCorps != CorpsTest.TypeCorps)) { continue; } if (SwCorps.eComparerGeometrie(CorpsTest.SwCorps) == Sw.Comparaison_e.Semblable) { CorpsTest.Nb += nbCorps; if (Maj) { var errors = param.SetSystemValue3(CorpsTest.Repere * 0.001, (int)swSetValueInConfiguration_e.swSetValue_InSpecificConfigurations, cfg); if (errors > 0) { WindowLog.EcrireF(" Erreur de mise à jour {0}", (swSetValueReturnStatus_e)errors); } } CorpsTest.AjouterModele(mdl, cfg, fDossier.GetID()); Ajoute = true; break; } } } if ((Ajoute == false) && Maj) { var rep = GenRepereDossier; var errors = param.SetSystemValue3(rep * 0.001, (int)swSetValueInConfiguration_e.swSetValue_InSpecificConfigurations, cfg); if (errors > 0) { WindowLog.EcrireF(" Erreur de mise à jour {0}", (swSetValueReturnStatus_e)errors); } var corps = new Corps(SwCorps, TypeCorps, MateriauCorps); corps.Nb = nbCorps; corps.Repere = rep; corps.AjouterModele(mdl, cfg, fDossier.GetID()); ListeCorps.Add(corps); } } } mdl.eFermerSiDifferent(MdlBase); } MdlBase.eActiver(swRebuildOnActivation_e.swRebuildActiveDoc); int Errors = 0, Warnings = 0; MdlBase.Save3((int)swSaveAsOptions_e.swSaveAsOptions_SaveReferenced + (int)swSaveAsOptions_e.swSaveAsOptions_Silent, ref Errors, ref Warnings); MdlBase.EditRebuild3(); // Petit récap WindowLog.SautDeLigne(); WindowLog.EcrireF("Nb de corps unique : {0}", ListeCorps.Count); int nbtt = 0; foreach (var corps in ListeCorps) { nbtt += corps.Nb; WindowLog.EcrireF("P{0} ×{1}", corps.Repere, corps.Nb); } WindowLog.EcrireF("Nb total de corps : {0}", nbtt); } catch (Exception e) { this.LogErreur(new Object[] { e }); } }