Artikel mit Funktionsschablone erzeugen
Schnell mal per API Artikel mit Funktionsschablone erzeugen war meine Aufgabe…
Naja nicht so einfach:
public static MDPart CreateOrUpdateWithFunctionTemplate(Function function)
{
// Need to lock project
var project = function.Project;
project.SmartLock();
function.SmartLock();
// Init
var partsDatabase = new MDPartsManagement().OpenDatabase();
var articleReference = function.ArticleReferences.First();
articleReference.SmartLock();
var partNr = articleReference.PartNr;
var partVariant = articleReference.VariantNr;
MDPart part = partsDatabase.GetPart(partNr, partVariant);
// Create new part
if (part == null)
{
// LockingVector is needed because of locking exception from EPLAN action (no catch possible)
LockingVector lockingVector = new LockingVector();
int stateId = lockingVector.PauseManualLock();
new CommandLineInterpreter().Execute("XPameCreateType");
lockingVector.ResumeManualLock(stateId);
partsDatabase = new MDPartsManagement().OpenDatabase(); // Second Call needed to get new part
part = partsDatabase.GetPart(partNr, partVariant);
}
else
{
// Rename part
string suffix = "_temp";
string partNrTemp = part.PartNr + suffix;
try
{
articleReference.PartNr = partNrTemp;
articleReference.StoreToObject();
// Quiet create temp part
var application = new EplApplication();
var quiteMode = application.QuietMode;
application.QuietMode = EplApplication.QuietModes.ShowNoDialogs;
new CommandLineInterpreter().Execute("XPameCreateType");
application.QuietMode = quiteMode;
}
finally
{
// Rename back
articleReference.PartNr = partNr;
articleReference.StoreToObject();
}
// Copy FunctionTemplate
partsDatabase = new MDPartsManagement().OpenDatabase(); // Second Call needed to get new part
MDPart partDuplicate = partsDatabase.GetPart(partNrTemp, partVariant);
foreach (var partFunctionTemplatePosition in part.FunctionTemplatePositions)
{
part.RemoveFunctionTemplatePosition(partFunctionTemplatePosition);
}
foreach (var partDuplicateFunctionTemplatePosition in partDuplicate.FunctionTemplatePositions)
{
part.AddFunctionTemplatePosition(partDuplicateFunctionTemplatePosition);
}
partsDatabase.RemovePart(partDuplicate);
// Check if article is in project
var existingArticle = project.Articles
.FirstOrDefault(obj =>
obj.PartNr.Equals(partNrTemp) && obj.VariantNr.Equals(partVariant)
);
if (existingArticle != null)
{
existingArticle.SmartLock();
existingArticle.Remove();
}
}
// Load data
var article = project.Articles
.FirstOrDefault(obj =>
obj.PartNr.Equals(partNr) && obj.VariantNr.Equals(partVariant)
);
if (article != null)
{
article.SmartLock();
article.LoadFromMasterdata();
}
return part;
}
Es darf nur ein Artikel hinterlegt sein, sonst schlägt die Action XPameCreateType fehl. Ist nicht schön, aber die Funktionsschablone von Hand zu erstellen ist mir zu heikel. Denn da kommt ja oftmals was neues dazu :^)