Announcements
Notice: Upload of PDF documents is currently unavailable across the Community due to an ongoing issue.

Failed to create family instance on face.

Failed to create family instance on face.

ankofl
Advocate Advocate
289 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)
290 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