Failed to create family instance on face.

Failed to create family instance on face.

ankofl
Advocate Advocate
67 Views
1 Reply
Message 1 of 2

Failed to create family instance on face.

ankofl
Advocate
Advocate

I'm trying to create a family (it's "Face-based"), but I get the following error

Failed to create family instance on face.

в ?A0xf5bdfe27.FamilyInstance_create(ADocument* pADoc, ElementId symbolId, Pick* pPick, XYZ* refPoint, XYZ* refDir, ElementId levelId, Boolean doRegenerate)
в ?A0xf5bdfe27.newFamilyInstance(Document doc, Reference reference, XYZ location, XYZ direction, FamilySymbol symbol)


The code is shown below.

TS - is a wrapper over a Transaction,
doc.DrawLine() extension-method for drawing model lines

var doc = commandData.GetDoc();
TS.Create(doc);
TS.Start();

XYZ point1 = new XYZ(3,3,3); // Первая точка (центр грани)
XYZ point2 = point1 + XYZ.BasisX.Normalize(); // Вторая точка (смещение по X)
XYZ point3 = point1 + XYZ.BasisY.Normalize(); // Третья точка (смещение по Y)

// Проверяем неколлинеарность
XYZ vec1 = point2 - point1;
XYZ vec2 = point3 - point1;
XYZ normal = vec1.CrossProduct(vec2).Normalize();
if (normal.IsZeroLength())
{
				throw new InvalidOperationException("Точки лежат на одной прямой, невозможно создать плоскость.");
}

// 2. Создаём геометрическую плоскость
Plane plane = Plane.CreateByThreePoints(point1, point2, point3);

// 3. Создаём SketchPlane
SketchPlane sketchPlane = SketchPlane.Create(doc, plane);

// 4. Рисуем линии для отладки
doc.DrawLine(point1, point2);
doc.DrawLine(point1, point3);
doc.DrawLine(point1, point1 + normal * 5.0);

// 7. Размещаем семейство
FamilyInstance instance = doc.Create.NewFamilyInstance(
				sketchPlane.GetPlaneReference(), // Ссылка на плоскость
				point1,                          // Точка размещения
				normal,                            // Ось ориентации
				doc.GetFamilySymbol("Placer_OST_MechanicalEquipment", "Placer_OST_MechanicalEquipment")                           // Символ семейства
);

TS.Commit();

Can anyone tell me how to do this correctly? I need to create a family on an axial plane created by three points: 
1.
Origin
2.
 Forward,
3. Right or Up 

Thank you!
 

0 Likes
Accepted solutions (1)
68 Views
1 Reply
Reply (1)
Message 2 of 2

ankofl
Advocate
Advocate
Accepted solution

ankofl_0-1756892468552.png

public override Result Run(ExternalCommandData commandData)
{
	try
	{
		var doc = commandData.GetDoc();
		TS.Create(doc);
		TS.Start();

		doc.DeleteTempLines();

		// Исходные данные (могут быть любыми)
		XYZ bubbleEnd = new XYZ(0, 1, 0);  // Origin, может быть любой XYZ
		XYZ forward = new XYZ(1, 1, 1).Normalize();  // Нормализованный вектор направления (любой, длина=1)

		// Вычисляем freeEnd
		XYZ freeEnd = bubbleEnd + forward;  // Или + forward * someLength, если нужна длина >1

		// Вычисляем cutVec: перпендикулярный forward
		XYZ cutVec;
		XYZ up = new XYZ(0, 0, 1);  // Базовый вектор (world up, ось Z)
		if (Math.Abs(forward.Dot(up)) < 0.999)  // Если forward не почти параллелен Z (трешхолд для floating point)
		{
			cutVec = forward.Cross(up).Normalize();
		}
		else
		{
			// Если параллелен Z, берем другой базовый (например, Y)
			XYZ altUp = new XYZ(0, 1, 0);
			cutVec = forward.Cross(altUp).Normalize();
		}

		doc.DrawPoint(XYZ.Zero);

		ReferencePlane refPlane = doc.Create.NewReferencePlane(bubbleEnd, freeEnd, cutVec, null);

		doc.DrawLine(bubbleEnd, freeEnd, Red_FreeEnd);
		doc.DrawLine(bubbleEnd, bubbleEnd + cutVec, Green_CutVec);
		doc.DrawLine(bubbleEnd, bubbleEnd + refPlane.Normal, Blue_Normal);

		string namePlacer = "Placer_OST_MechanicalEquipment";

		// 7. Размещаем семейство
		FamilyInstance instance = doc.Create.NewFamilyInstance(
			refPlane.GetReference(), // Ссылка на плоскость
			bubbleEnd,                          // Точка размещения
			cutVec,                            // Ось ориентации
			doc.GetFamilySymbol(namePlacer, namePlacer)
		);

		TS.Commit();

		return Result.Succeeded;
	}
	catch (Exception e)
    {
		TS.RollBack();
        StyledMessageBox.Show(nameof(Command_Debug_1), e);
		return Result.Failed;
    }
}

 

 

0 Likes