| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > JavaScript. nanoCAD 5. Экспорт геометрии в позиционный проект Stark ES

JavaScript. nanoCAD 5. Экспорт геометрии в позиционный проект Stark ES

Ответ
Поиск в этой теме
Непрочитано 26.05.2019, 16:52 3 | #1
JavaScript. nanoCAD 5. Экспорт геометрии в позиционный проект Stark ES
Нубий-IV
 
Инженер-философ
 
Хабаровск
Регистрация: 24.04.2019
Сообщений: 1,858

Если геометрия уже начерчена полилиниями, задать толщины с высотами и экспортировать получается быстрее, чем заново обводить в DxfModel/Poseidon.




Экспорт геометрии:
Код:
[Выделить все]
/**
 * Экспорт геометрии из nanoCAD в позиционный проект Stark ES
 * Настройки масштаба, материалов и пути для сохранения по умолчанию - в конце файла
 *	Слои конвертируются в этажи
 *	Горизонтальные замкнутые полилинии - в отверстия
 *	Горизонтальные замкнутые полилинии с глобальной толщиной - в плиты
 *	Наклонные замкнутые полилинии с глобальной толщиной - в рампы
 *	Горизонтальные замкнутые прямоугольные полилинии с положительной 3D-высотой - в колонны
 *	Горизонтальные замкнутые прямоугольные полилинии с отрицательной 3D-высотой - в сваи
 *	Горизонтальные полилинии с глобальной толщиной и положительной 3D-высотой - в стены
 *	Горизонтальные полилинии с глобальной толщиной и отрицательной 3D-высотой - в балки
 *	Горизонтальные круги с положительной 3D-высотой - в колонны
 *	Горизонтальные круги с отрицательной 3D-высотой - в сваи
 *	Горизонтальные отрезки с положительной 3D-высотой - в вертикальные отверстия
 *	Обычные отрезки - в стержни
 * Экспортируется также содержимое блоков
 * 	Элементы блока, лежащие на слое "0", перемещаются на слой родительского блока
 * В круглых скобках можно записать параметры в виде: 
 * Этаж 1 (L 6.6  H 3.3  E 3.1e6  rho 3.0  nu 0.3  t 0  g -2.5  p -2  dr 0.3  ds 0.4  x 0.1  y 0.2  w 45 Ground 1)
 *	L, H - уровень и высота этажа, м
 *	E, rho, nu - параметры материала
 *	t - толщина плиты или рампы, м. Позволяет задать нулевую толщину плиты для грунта
 *	g - постоянная нагрузка для плит, рамп и стен, кПа
 *	p - временная нагрузка для плит и рамп, кПа
 *	dr, ds - шаг сетки по осям r,s, в метрах, 
 *	x, y   - координаты начала шаблона сетки, в метрах
 *	w - угол поворота шаблона в градусах
 *	Ground - тип грунтового основания для плит
 *		1 - плита на грунтовом основании
 *		2 - высокий свайный ростверк
 *		3 - низкий свайный ростверк
 * Если параметры этажа не заданы, они будут вычислены на основе геометрии объектов.
 * Если параметры материалов или сетки не заданы, будут приняты параметры по умолчанию.
 * При записи проекта скобки с параметрами будут удалены из имени этажа
 */

/**
 * Возвращает вершину полилинии, преобразованную из объектной системы координат в мировую, в виде массива
 * 
 * @param {*} point 2D-точка (координата вершины полилинии в объектных координатах)
 * @param {*} elevation Возвышение полилинии
 * @param {*} normal Нормаль полилинии
 */
function OCSpointToWCSarray(point, elevation, normal)
{
	var point2D = Utility.CreateSafeArrayFromVector(point).toArray()
	var point3D = new Array(point2D[0], point2D[1], elevation)
	var pointOCS = Utility.CreateTypedArrayFromJSArray(5, point3D)
	var pointWCS = Utility.TranslateCoordinates(pointOCS, acOCS, acWorld, false, normal)
	return Utility.CreateSafeArrayFromVector(pointWCS).toArray()
}

/**
 * Возвращает значение парметра, записанного в скобках в имени слоя, или null
 * @param {String} parameter Имя параметра, значение которого разыскивается
 * @param {String} layerName Имя слоя с парметром в скобках
 */
function parseParameter(parameter, layerName) {
	// Поиск значения параметра внутри скобок
	var re = new RegExp("[(].*" + parameter + " +([^ ]+)" + ".*[)]")
	return re.exec(layerName) ? RegExp.$1 : null;
}

/**
 * Создает экземпляр уровня по имени слоя
 * @constructor
 * @param {String} layerName Имя слоя
 */
function Level(layerName, zmin, zmax) {
	// Установка параметров
	var L = parseFloat(parseParameter("L", layerName))
	if (!isNaN(L))
		this.L = L

	var H = parseFloat(parseParameter("H", layerName))
	if (!isNaN(H))
		this.H = H

	this.Zmax = zmax
	this.Zmin = zmin

	// Удаление скобок с параметрами
	var re = new RegExp("[ ]*[(].*[)]")
	this.Name = layerName.replace(re, "")

	/**
	 * Дополняет старое определение уровня по копии того же уровня, созданной из другого имени слоя. Имена уровней должны совпадать.
	 * @param {Object} level Уровень, созданный на основе другого слоя, возможно, с другими параметрами.
	 */
	this.Merge = function (level) {
		if (level.L)
			if (this.L)
				this.L = Math.max(this.L, level.L)
			else
				this.L = level.L

		if (level.H)
			if (this.H)
				this.H = Math.max(this.H, level.H)
			else
				this.H = level.H

		this.Zmax = Math.max(this.Zmax, level.Zmax)
		this.Zmin = Math.min(this.Zmin, level.Zmin)
	}
}

/**
 * Создает экземпляр позиции для записи в файл проекта (плита, колонна, ...)
 * @constructor
 * @param {String} id Идентификатор позиции ("AUSP-1", "W-5", ...)
 * @param {String} value Текстовое содержимое для экспорта в файл, кроме строк с идентификатором и этажом
 * @param {String} levelName Имя этажа
 */
function StarkPosition(id, value, levelName) {
	this.Id = id
	this.Value = value
	this.levelName = levelName
}

/**
 * Создает экземпляр материала
 * @constructor
 * @param {Number} E Модуль упругости, кПа
 * @param {Number} nu Коэффициент пуассона
 * @param {Number} rho Плотность, т/м3
 */
function Material(E, nu, rho) {
	this.E = E
	this.nu = nu
	this.rho = rho
	this.G = this.E / 2 / (1 + this.nu)
}

/**
 * Создает экземпляр позиционного проекта Stark
 * @constructor
 * @param {Number} Scale Масштабный множитель для геометрических размеров.
 * @param {Object} SlabsMaterial Материал плит
 * @param {Object} RampsMaterial Материал рамп
 * @param {Object} WallsMaterial Материал стен
 * @param {Object} BeamsMaterial Материал балок
 * @param {Object} ColumnsMaterial Материал колонн
 * @param {Object} PilesMaterial Материал свай
 * @param {Object} RodsMaterial Материал стержней
 */
function StarkPosProject(Scale, SlabsMaterial, RampsMaterial, WallsMaterial, BeamsMaterial, ColumnsMaterial, PilesMaterial, RodsMaterial) {
	this.Scale = Scale

	this.SlabsMaterial = SlabsMaterial
	this.RampsMaterial = RampsMaterial
	this.WallsMaterial = WallsMaterial
	this.BeamsMaterial = BeamsMaterial
	this.ColumnsMaterial = ColumnsMaterial
	this.PilesMaterial = PilesMaterial
	this.RodsMaterial = RodsMaterial

	// Список всех позиций в проекте
	this.Positions = new Array()

	// Список всех этажей в проекте
	this.Levels = new Array()

	// Счетчики позиций для генерации номера следующей позиции
	this.SlabsCount = 0
	this.RampsCount = 0
	this.HolesCount = 0
	this.WallsCount = 0
	this.BeamsCount = 0
	this.ColumnsCount = 0
	this.PilesCount = 0
	this.RodsCount = 0

	/**
	 * Возвращает следующий незанятый идентификатор плиты
	 * @returns {String}
	 */
	this.NextSlabId = function () {
		return "D-" + ++this.SlabsCount
	}

	/**
	 * Возвращает следующий незанятый идентификатор рампы
	 * @returns {String}
	 */
	this.NextRampId = function () {
		return "R-" + ++this.RampsCount
	}

	/**
	 * Возвращает следующий незанятый идентификатор отвертия
	 * @returns {String}
	 */
	this.NextHoleId = function () {
		return "AUSP-" + ++this.HolesCount
	}

	/**
	 * Возвращает следующий незанятый идентификатор стены
	 * @returns {String}
	 */
	this.NextWallId = function () {
		return "W-" + ++this.WallsCount
	}

	/**
	 * Возвращает следующий незанятый идентификатор балки
	 * @returns {String}
	 */
	this.NextBeamId = function () {
		return "UZ-" + ++this.BeamsCount
	}

	/**
	 * Возвращает следующий незанятый идентификатор колонны
	 * @returns {String}
	 */
	this.NextColumnId = function () {
		return "ST-" + ++this.ColumnsCount
	}

	/**
	 * Возвращает следующий незанятый идентификатор сваи
	 * @returns {String}
	 */
	this.NextPileId = function () {
		return "PF-" + ++this.PilesCount
	}

	/**
	 * Возвращает следующий незанятый идентификатор стержня
	 * @returns {String}
	 */
	this.NextRodId = function () {
		return "ROD-" + ++this.RodsCount
	}

	/**
	 * Возвращает идентификатор этажа по индексу в массиве этажей
	 * @param {Number} i Индекс в массиве этажей
	 * @returns {String}
	 */
	this.LevelIdByIndex = function (i) {
		return "EBENE-" + (i + 1)
	}

	/**
	 * Возвращает идентификатор этажа по имени. Предполагается, что этаж с таким именем уже был добавлен.
	 * @param {String} name Имя этажа
	 * @returns {String}
	 */
	this.LevelIdByName = function (name) {
		if (this.Levels.length < 2)
			return this.LevelIdByIndex(0)

		var min = 0
		var max = this.Levels.length - 1
		var curr = Math.floor((min + max) / 2)

		// Поиск по массиву этажей
		while (min < max) {
			if (name == this.Levels[curr].Name)
				break
			if (name > this.Levels[curr].Name)
				min = curr + 1
			if (name < this.Levels[curr].Name)
				max = curr
			curr = Math.floor((min + max) / 2)
		}

		return this.LevelIdByIndex(curr)
	}

	/**
	 * Добавляет этаж в список этажей проекта в алфавитном порядке. Добавляются только новые этажи. Существующие объединяются
	 * @param {Object} level 
	 */
	this.AddLevel = function (level) {
		var min = 0
		var max = this.Levels.length
		var curr = Math.floor((min + max) / 2)

		// Поиск позиции для вставки нового этажа
		while (min < max) {
			if (level.Name == this.Levels[curr].Name) {
				this.Levels[curr].Merge(level)
				return
			}
			if (level.Name > this.Levels[curr].Name)
				min = curr + 1
			if (level.Name < this.Levels[curr].Name)
				max = curr
			curr = Math.floor((min + max) / 2)
		}

		this.Levels.splice(curr, 0, level)
	}

	/**
	 * Создает и добавляет новую позицию в список позиций проекта
	 * @param {String} id Идентификатор позиции
	 * @param {String} value Текстовое представление позиции, кроме строк с идентификатором и этажом
	 * @param {String} levelName Имя этажа
	 */
	this.AddPosition = function (id, value, levelName) {
		this.Positions.push(new StarkPosition(id, value, levelName))
	}

	/**
	 * Добавляет в проект плиту, созданную на основе горизонтальной полилинии
	 * @param {Object} polyline Полилиния (AcDbPolyline)
	 */
	this.AddHorisontalPolylineSlab = function (polyline) {
		var id = this.NextSlabId()
		var XX = ""
		var YY = ""

		var nVerts = (Utility.CreateSafeArrayFromVector(polyline.Coordinates).ubound() + 1) / 2
		for (var i = 0; i < nVerts; i++) {
			var vertex = Utility.CreateSafeArrayFromVector(polyline.Coordinate(i)).toArray()
			XX += vertex[0] * this.Scale + " "
			YY += vertex[1] * this.Scale + " "
		}

		var Z = polyline.Elevation * this.Scale

		var E = parseFloat(parseParameter("E", polyline.Layer))
		if (isNaN(E))
			E = this.SlabsMaterial.E

		var rho = parseFloat(parseParameter("rho", polyline.Layer))
		if (isNaN(rho))
			rho = this.SlabsMaterial.rho * 10
		else
			rho *= 10

		var nu = parseFloat(parseParameter("nu", polyline.Layer))
		if (isNaN(nu))
			nu = this.SlabsMaterial.nu

		var t = parseFloat(parseParameter("t", polyline.Layer))
		if(isNaN(t))
			t = polyline.ConstantWidth * this.Scale

		var g = parseFloat(parseParameter("g", polyline.Layer))
		if(isNaN(g))
			g = 0

		var p = parseFloat(parseParameter("p", polyline.Layer))
		if(isNaN(p))
			p = 0

		var dr = parseFloat(parseParameter("dr", polyline.Layer))
		if(isNaN(dr))
			dr = 0

		var ds = parseFloat(parseParameter("ds", polyline.Layer))
		if(isNaN(ds))
			ds = 0

		var x = parseFloat(parseParameter("x", polyline.Layer))
		if(isNaN(x))
			x = 0

		var y = parseFloat(parseParameter("y", polyline.Layer))
		if(isNaN(y))
			y = 0

		var w = parseFloat(parseParameter("w", polyline.Layer))
		if(isNaN(w))
			w = 0

		var Ground = parseFloat(parseParameter("Ground", polyline.Layer))
		if(isNaN(Ground))
			Ground = 0
		
		var value =
			"{\r\n" +
			"    Ground =" + Ground + "\r\n" +
			"    Typ =Decke\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Polygon\r\n" +
			"      X =" + XX + "\r\n" +
			"      Y =" + YY + "\r\n" +
			"    }\r\n" +
			"    Material ={\r\n" +
			"      Typ =isotrop\r\n" +
			"      Dicke ={\r\n" +
			"        Typ =konstant\r\n" +
			"        d =" + t + "\r\n" +
			"      }\r\n" +
			"      E-Modul1 =" + E + "\r\n" +
			"      Wichte =" + rho + "\r\n" +
			"      Nue1 =" + nu + "\r\n" +
			"      Schubverzerrung =1\r\n" +
			"    }\r\n" +
			"    Belastung ={\r\n" +
			"      g =" + g + "\r\n" +
			"      p =" + p + "\r\n" +
			"      Lasttyp =\r\n" +
			"    }\r\n" +
			"    Generierung ={\r\n" +
			"      Typ =kartesisch\r\n" +
			"      X =" + x + "\r\n" +
			"      Y =" + y + "\r\n" +
			"      W =" + w + "\r\n" +
			"      dr =" + dr + "\r\n" +
			"      ds =" + ds + "\r\n" +
			"    }\r\n"

		if(p)
			value +=
				"    Lastfelder ={\r\n" +
				"      Liste =FELD-1 \r\n" +
				"      FELD-1 ={\r\n" +
				"        Typ =Polygon\r\n" +
				"        X =" + XX + " \r\n" +
				"        Y =" + YY + " \r\n" +
				"        Lastfall ={\r\n" +
				"          Typ =automatisch\r\n" +
				"          Nr =2\r\n" +
				"          Name =\r\n" +
				"        }\r\n" +
				"      }\r\n" +
				"    }\r\n"

		value +=
			"    Oberflaeche ={\r\n" +
			"    Typ =Ebene\r\n" +
			"    Loks ={\r\n" +
			"      Typ =global\r\n" +
			"      Ursprung =0 0 " + Z + "\r\n" +
			"    }\r\n" +
			"  }\r\n"

		var level = new Level(polyline.Layer, Z - t, Z)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Добавляет в проект рампу, созданную на основе наклонной полилинии
	 * @param {Object} polyline Полилиния (AcDbPolyline)
	 */
	this.AddInclinedPolylineRamp = function (polyline) {
		var id = this.NextRampId()

		var p1 = OCSpointToWCSarray(polyline.Coordinate(0), polyline.Elevation, polyline.Normal)
		var p2 = OCSpointToWCSarray(polyline.Coordinate(1), polyline.Elevation, polyline.Normal)
		var p3 = OCSpointToWCSarray(polyline.Coordinate(2), polyline.Elevation, polyline.Normal)

		var P1X = p1[0] * this.Scale
		var P1Y = p1[1] * this.Scale
		var P1Z = p1[2] * this.Scale

		var P2X = p2[0] * this.Scale
		var P2Y = p2[1] * this.Scale
		var P2Z = p2[2] * this.Scale

		var P3X = p3[0] * this.Scale
		var P3Y = p3[1] * this.Scale
		var P3Z = p3[2] * this.Scale

		var Zmin = Math.min(P1Z, P2Z, P3Z)
		var Zmax = Math.max(P1Z, P2Z, P3Z)

		var XX = ""
		var YY = ""

		var nVerts = (Utility.CreateSafeArrayFromVector(polyline.Coordinates).ubound() + 1) / 2
		var startVertex = Utility.CreateSafeArrayFromVector(polyline.Coordinate(0)).toArray()
		for (var i = 0; i < nVerts; i++) {
			var vertex = Utility.CreateSafeArrayFromVector(polyline.Coordinate(i)).toArray()
			XX += (vertex[0] - startVertex[0]) * this.Scale + " "
			YY += (vertex[1] - startVertex[1]) * this.Scale + " "

			var point = OCSpointToWCSarray(polyline.Coordinate(i), polyline.Elevation, polyline.Normal)
			Zmin = Math.min(Zmin, point[2])
			Zmax = Math.max(Zmax, point[2])
		}

		var E = parseFloat(parseParameter("E", polyline.Layer))
		if (isNaN(E))
			E = this.RampsMaterial.E

		var rho = parseFloat(parseParameter("rho", polyline.Layer))
		if (isNaN(rho))
			rho = this.RampsMaterial.rho * 10
		else
			rho *= 10

		var nu = parseFloat(parseParameter("nu", polyline.Layer))
		if (isNaN(nu))
			nu = this.RampsMaterial.nu

		var t = parseFloat(parseParameter("t", polyline.Layer))
		if(isNaN(t))
			t = polyline.ConstantWidth * this.Scale

		var g = parseFloat(parseParameter("g", polyline.Layer))
		if(isNaN(g))
			g = 0

		var p = parseFloat(parseParameter("p", polyline.Layer))
		if(isNaN(p))
			p = 0

		var dr = parseFloat(parseParameter("dr", polyline.Layer))
		if(isNaN(dr))
			dr = 0

		var ds = parseFloat(parseParameter("ds", polyline.Layer))
		if(isNaN(ds))
			ds = 0

		var x = parseFloat(parseParameter("x", polyline.Layer))
		if(isNaN(x))
			x = 0

		var y = parseFloat(parseParameter("y", polyline.Layer))
		if(isNaN(y))
			y = 0

		var w = parseFloat(parseParameter("w", polyline.Layer))
		if(isNaN(w))
			w = 0

		var value =
			"{\r\n" +
			"    Typ =Rampe\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Polygon\r\n" +
			"      X =" + XX + " \r\n" +
			"      Y =" + YY + " \r\n" +
			"    }\r\n" +
			"    Material ={\r\n" +
			"      Typ =isotrop\r\n" +
			"      Dicke ={\r\n" +
			"        Typ =konstant\r\n" +
			"        d =" + t + "\r\n" +
			"      }\r\n" +
			"      E-Modul1 =" + E + "\r\n" +
			"      Wichte =" + rho + "\r\n" +
			"      Nue1 =" + nu + "\r\n" +
			"      Schubverzerrung =1\r\n" +
			"    }\r\n" +
			"    Belastung ={\r\n" +
			"      g =" + g + "\r\n" +
			"      p =" + p + "\r\n" +
			"      Lasttyp =\r\n" +
			"    }\r\n"

		if(p)
			value +=
				"    Lastfelder ={\r\n" +
				"      Liste =FELD-1 \r\n" +
				"      FELD-1 ={\r\n" +
				"        Typ =Polygon\r\n" +
				"        X =" + XX + " \r\n" +
				"        Y =" + YY + " \r\n" +
				"        Lastfall ={\r\n" +
				"          Typ =automatisch\r\n" +
				"          Nr =2\r\n" +
				"          Name =\r\n" +
				"        }\r\n" +
				"      }\r\n" +
				"    }\r\n"

		value +=
			"    Generierung ={\r\n" +
			"      Typ =kartesisch\r\n" +
			"      X =" + x + "\r\n" +
			"      Y =" + y + "\r\n" +
			"      W =" + w + "\r\n" +
			"      dr =" + dr + "\r\n" +
			"      ds =" + ds + "\r\n" +
			"    }\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =3-Punkte\r\n" +
			"        Ursprung =" + P1X + " " + P1Y + " " + P1Z + "\r\n" +
			"        P1 =" + P1X + " " + P1Y + " " + P1Z + "\r\n" +
			"        P2 =" + P2X + " " + P2Y + " " + P2Z + "\r\n" +
			"        P3 =" + P3X + " " + P3Y + " " + P3Z + "\r\n" +
			"      }\r\n" +
			"    }\r\n"

		var level = new Level(polyline.Layer, Zmin, Zmax)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Добавляет в проект отверстие, созданное на основе горизонтальной полилинии
	 * @param {Object} polyline Полилиния (AcDbPolyline)
	 */
	this.AddHorisontalPolylineHole = function (polyline) {
		var id = this.NextHoleId()
		var XX = ""
		var YY = ""

		var nVerts = (Utility.CreateSafeArrayFromVector(polyline.Coordinates).ubound() + 1) / 2
		for (var i = 0; i < nVerts; i++) {
			var vertex = Utility.CreateSafeArrayFromVector(polyline.Coordinate(i)).toArray()
			XX += vertex[0] * this.Scale + " "
			YY += vertex[1] * this.Scale + " "
		}

		var Z = polyline.Elevation * this.Scale

		var value =
			"{\r\n" +
			"    Typ =Aussparung\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Polygon\r\n" +
			"      X =" + XX + "\r\n" +
			"      Y =" + YY + "\r\n" +
			"    }\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =global\r\n" +
			"        Ursprung =0 0 " + Z + "\r\n" +
			"      }\r\n" +
			"    }\r\n"

		var level = new Level(polyline.Layer, Z, Z)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Добавляет в проект стену на основе сегмента горизонтальной полилинии
	 * @param {Object} polyline Полилиния (AcDbPolyline)
	 * @param {Number} i1 Индекс первой вершины сегмента полилинии
	 * @param {Number} i2 Индекс второй вершины сегмента полилинии
	 */
	this.AddHorisontalPolylineWallSegment = function(polyline, i1, i2)
	{
		var id = this.NextWallId()

		var vertex1 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(i1)).toArray()
		var vertex2 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(i2)).toArray()
		var X1 = vertex1[0] * this.Scale
		var Y1 = vertex1[1] * this.Scale
		var X2 = vertex2[0] * this.Scale
		var Y2 = vertex2[1] * this.Scale

		var dx = vertex2[0] - vertex1[0]
		var dy = vertex2[1] - vertex1[1]
		var L = Math.sqrt(dx * dx + dy * dy) * this.Scale
		var H = polyline.Thickness * this.Scale
		var Z = polyline.Elevation * this.Scale + H

		var E = parseFloat(parseParameter("E", polyline.Layer))
		if (isNaN(E))
			E = this.WallsMaterial.E

		var rho = parseFloat(parseParameter("rho", polyline.Layer))
		if (isNaN(rho))
			rho = this.WallsMaterial.rho * 10
		else
			rho *= 10

		var nu = parseFloat(parseParameter("nu", polyline.Layer))
		if (isNaN(nu))
			nu = this.WallsMaterial.nu

		var t = parseFloat(parseParameter("t", polyline.Layer))
		if(isNaN(t))
			t = polyline.ConstantWidth * this.Scale

		var g = parseFloat(parseParameter("g", polyline.Layer))
		if(isNaN(g))
			g = 0

		var dr = parseFloat(parseParameter("dr", polyline.Layer))
		if(isNaN(dr))
			dr = 0

		var ds = parseFloat(parseParameter("ds", polyline.Layer))
		if(isNaN(ds))
			ds = 0

		var x = parseFloat(parseParameter("x", polyline.Layer))
		if(isNaN(x))
			x = 0

		var y = parseFloat(parseParameter("y", polyline.Layer))
		if(isNaN(y))
			y = 0

		var w = parseFloat(parseParameter("w", polyline.Layer))
		if(isNaN(w))
			w = 0

		var value =
			"{\r\n" +
			"    Typ =Wand\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Polygon\r\n" +
			"      X =0 " + L + " " + L + " 0 0 \r\n" +
			"      Y =0 0 " + (-H) + " " + (-H) + " 0 \r\n" +
			"    }\r\n" +
			"    Material ={\r\n" +
			"      Typ =isotrop\r\n" +
			"      Dicke ={\r\n" +
			"        Typ =konstant\r\n" +
			"        d =" + t + "\r\n" +
			"      }\r\n" +
			"      E-Modul1 =" + E + "\r\n" +
			"      Wichte =" + rho + "\r\n" +
			"      Nue1 =" + nu + "\r\n" +
			"      Schubverzerrung =1\r\n" +
			"    }\r\n" +
			"    Belastung ={\r\n" +
			"      g =" + g + "\r\n" +
			"      p =0\r\n" +
			"      Lasttyp =\r\n" +
			"    }\r\n" +
			"    Generierung ={\r\n" +
			"      Typ =kartesisch\r\n" +
			"      X =" + x + "\r\n" +
			"      Y =" + y + "\r\n" +
			"      W =" + w + "\r\n" +
			"      dr =" + dr + "\r\n" +
			"      ds =" + ds + "\r\n" +
			"    }\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Polygon\r\n" +
			"      Loks ={\r\n" +
			"        Typ =3-Vektoren\r\n" +
			"        Ursprung =0 0 0\r\n" +
			"        U =0 0 0\r\n" +
			"        V =0 0 0\r\n" +
			"        W =0 0 0\r\n" +
			"      }\r\n" +
			"      Polygon ={\r\n" +
			"        X =" + X1 + " " + X2 + "\r\n" +
			"        Y =" + Y1 + " " + Y2 + "\r\n" +
			"        Oberflaeche ={\r\n" +
			"          Typ =Ebene\r\n" +
			"          Loks ={\r\n" +
			"            Typ =global\r\n" +
			"            Ursprung =0 0 " + Z + "\r\n" +
			"          }\r\n" +
			"        }\r\n" +
			"      }\r\n" +
			"    }\r\n"

		var level = new Level(polyline.Layer, Z - H, Z)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Добавляет в проект стены, созданные на основе горизонтальной полилинии
	 * @param {Object} polyline Полилиния (AcDbPolyline)
	 */
	this.AddHorisontalPolylineWall = function (polyline) {
		var nSegments = (Utility.CreateSafeArrayFromVector(polyline.Coordinates).ubound() - 1) / 2
		for (var i = 0; i < nSegments; i++)
			this.AddHorisontalPolylineWallSegment(polyline, i, i+1)

		if(polyline.Closed)
			this.AddHorisontalPolylineWallSegment(polyline, nSegments, 0)
	}

	/**
	 * Добавляет в проект балку на основе сегмента горизонтальной полилинии
	 * @param {Object} polyline Полилиния (AcDbPolyline)
	 * @param {Number} i1 Индекс первой вершины сегмента полилинии
	 * @param {Number} i2 Индекс второй вершины сегмента полилинии
	 */
	this.AddHorisontalPolylineBeamSegment = function(polyline, i1, i2)
	{
		var id = this.NextBeamId()

		var vertex1 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(i1)).toArray()
		var vertex2 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(i2)).toArray()
		var X1 = vertex1[0] * this.Scale
		var Y1 = vertex1[1] * this.Scale
		var X2 = vertex2[0] * this.Scale
		var Y2 = vertex2[1] * this.Scale

		var dx = vertex2[0] - vertex1[0]
		var dy = vertex2[1] - vertex1[1]
		var L = Math.sqrt(dx * dx + dy * dy) * this.Scale
		var B = polyline.ConstantWidth * this.Scale
		var H = - polyline.Thickness * this.Scale
		var Z = polyline.Elevation * this.Scale

		var E = parseFloat(parseParameter("E", polyline.Layer))
		if (isNaN(E))
			E = this.BeamsMaterial.E

		var rho = parseFloat(parseParameter("rho", polyline.Layer))
		if (isNaN(rho))
			rho = this.BeamsMaterial.rho

		var nu = parseFloat(parseParameter("nu", polyline.Layer))
		if (isNaN(nu))
			nu = this.BeamsMaterial.nu

		var G = E / 2 / (1 + nu)

		var value =
			"{\r\n" +
			"    Typ =Unterzug\r\n" +
			"    Material ={\r\n" +
			"      Typ =Параметрическое\r\n" +
			"      Sect =1 " + B + " " + H + "\r\n" +
			"      E-Mod =" + E + "\r\n" +
			"      Rho =" + rho + "\r\n" +
			"      G-Mod =" + G + "\r\n" +
			"      e =0\r\n" +
			"      Alpha =0\r\n" +
			"    }\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Linienzug\r\n" +
			"      X =" + X1 + " " + X2 + "\r\n" +
			"      Y =" + Y1 + " " + Y2 + "\r\n" +
			"    }\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =global\r\n" +
			"        Ursprung =0 0 " + Z + "\r\n" +
			"      }\r\n" +
			"    }\r\n"

		var level = new Level(polyline.Layer, Z - H, Z)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Добавляет в проект балки, созданные на основе горизонтальной полилинии
	 * @param {Object} polyline Полилиния (AcDbPolyline)
	 */
	this.AddHorisontalPolylineBeam = function (polyline) {
		var nSegments = (Utility.CreateSafeArrayFromVector(polyline.Coordinates).ubound() - 1) / 2
		for (var i = 0; i < nSegments; i++)
			this.AddHorisontalPolylineBeamSegment(polyline, i, i+1)

		if (polyline.Closed)
			this.AddHorisontalPolylineBeamSegment(polyline, nSegments, 0)
	}

	/**
	 * Добавляет в проект колонну, созданную на основе горизонтальной полилинии
	 * @param {Object} polyline Полилиния (AcDbPolyline)
	 */
	this.AddHorisontalPolylineColumn = function (polyline) {
		var id = this.NextColumnId()

		var v1 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(0)).toArray()
		var v2 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(1)).toArray()
		var v3 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(2)).toArray()
		var v4 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(3)).toArray()

		var X = (v1[0] + v2[0] + v3[0] + v4[0]) / 4 * this.Scale
		var Y = (v1[1] + v2[1] + v3[1] + v4[1]) / 4 * this.Scale

		var dx1 = v2[0] - v1[0]; var dy1 = v2[1] - v1[1]; var L1 = Math.sqrt(dx1 * dx1 + dy1 * dy1)
		var dx2 = v3[0] - v2[0]; var dy2 = v3[1] - v2[1]; var L2 = Math.sqrt(dx2 * dx2 + dy2 * dy2)
		var dx3 = v4[0] - v3[0]; var dy3 = v4[1] - v3[1]; var L3 = Math.sqrt(dx3 * dx3 + dy3 * dy3)
		var dx4 = v1[0] - v4[0]; var dy4 = v1[1] - v4[1]; var L4 = Math.sqrt(dx4 * dx4 + dy4 * dy4)

		var B = (L1 + L3) / 2 * this.Scale
		var H = (L2 + L4) / 2 * this.Scale
		var L = polyline.Thickness * this.Scale
		var Z = polyline.Elevation * this.Scale + L

		var alpha = 90 - Math.atan2(dx1, dy1) / Math.PI * 180

		var E = parseFloat(parseParameter("E", polyline.Layer))
		if (isNaN(E))
			E = this.ColumnsMaterial.E

		var rho = parseFloat(parseParameter("rho", polyline.Layer))
		if (isNaN(rho))
			rho = this.ColumnsMaterial.rho

		var nu = parseFloat(parseParameter("nu", polyline.Layer))
		if (isNaN(nu))
			nu = this.ColumnsMaterial.nu

		var value =
			"{\r\n" +
			"    Typ =Stuetze\r\n" +
			"    Material ={\r\n" +
			"      rho =" + rho + "\r\n" +
			"      Typ =Параметрическое\r\n" +
			"      Sect =1 " + B + " " + H + "\r\n" +
			"    }\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Punkt\r\n" +
			"      X =" + X + "\r\n" +
			"      Y =" + Y + "\r\n" +
			"      Alpha =" + alpha + "\r\n" +
			"      Verfeinerung =0\r\n" +
			"    }\r\n" +
			"    Art =Zugfeder\r\n" +
			"    Auflagerung ={\r\n" +
			"      Fg =TransT\r\n" +
			"      Steif =0\r\n" +
			"      l =" + L + "\r\n" +
			"      E-Mod =" + E + "\r\n" +
			"      nue =" + nu + "\r\n" +
			"    }\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =global\r\n" +
			"        Ursprung =0 0 " + Z + "\r\n" +
			"      }\r\n" +
			"    }\r\n"

		var level = new Level(polyline.Layer, Z - L, Z)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Добавляет в проект сваю, созданную на основе горизонтальной полилинии
	 * @param {Object} polyline Полилиния (AcDbPolyline)
	 */
	this.AddHorisontalPolylinePile = function (polyline) {
		var id = this.NextPileId()

		var v1 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(0)).toArray()
		var v2 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(1)).toArray()
		var v3 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(2)).toArray()
		var v4 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(3)).toArray()

		var X = (v1[0] + v2[0] + v3[0] + v4[0]) / 4 * this.Scale
		var Y = (v1[1] + v2[1] + v3[1] + v4[1]) / 4 * this.Scale

		var dx1 = v2[0] - v1[0]; var dy1 = v2[1] - v1[1]; var L1 = Math.sqrt(dx1 * dx1 + dy1 * dy1)
		var dx2 = v3[0] - v2[0]; var dy2 = v3[1] - v2[1]; var L2 = Math.sqrt(dx2 * dx2 + dy2 * dy2)
		var dx3 = v4[0] - v3[0]; var dy3 = v4[1] - v3[1]; var L3 = Math.sqrt(dx3 * dx3 + dy3 * dy3)
		var dx4 = v1[0] - v4[0]; var dy4 = v1[1] - v4[1]; var L4 = Math.sqrt(dx4 * dx4 + dy4 * dy4)

		var B = (L1 + L3) / 2 * this.Scale
		var H = (L2 + L4) / 2 * this.Scale
		var L = - polyline.Thickness * this.Scale
		var Z = polyline.Elevation * this.Scale

		var alpha = 90 - Math.atan2(dx1, dy1) / Math.PI * 180

		var E = parseFloat(parseParameter("E", polyline.Layer))
		if (isNaN(E))
			E = this.PilesMaterial.E

		var rho = parseFloat(parseParameter("rho", polyline.Layer))
		if (isNaN(rho))
			rho = this.PilesMaterial.rho

		var nu = parseFloat(parseParameter("nu", polyline.Layer))
		if (isNaN(nu))
			nu = this.PilesMaterial.nu

		var value =
			"{\r\n" +
			"    Typ =Pile_Hanging\r\n" +
			"    Material ={\r\n" +
			"      Typ =Rechteckstuetze\r\n" +
			"      b =" + B + "\r\n" +
			"      d =" + H + "\r\n" +
			"      rho =" + rho + "\r\n" +
			"    }\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Punkt\r\n" +
			"      X =" + X + "\r\n" +
			"      Y =" + Y + "\r\n" +
			"      Alpha =" + alpha + "\r\n" +
			"      Verfeinerung =1\r\n" +
			"    }\r\n" +
			"    Art =Druck-/Zugfeder\r\n" +
			"    Auflagerung ={\r\n" +
			"      Fg =RotR\r\n" +
			"      Steif =0\r\n" +
			"      l =" + L + "\r\n" +
			"      E-Mod =" + E + "\r\n" +
			"      nue =" + nu + "\r\n" +
			"    }\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =global\r\n" +
			"        Ursprung =0 0 " + Z + "\r\n" +
			"      }\r\n" +
			"    }"

		var level = new Level(polyline.Layer, Z - L, Z)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Добавляет в проект колонну, созданную на основе горизонтального круга
	 * @param {Object} circle Круг (AcDbCircle)
	 */
	this.AddHorisontalCircleColumn = function (circle) {
		var id = this.NextColumnId()

		var center = Utility.CreateSafeArrayFromVector(circle.Center).toArray()
		var X = center[0] * this.Scale
		var Y = center[1] * this.Scale
		var L = circle.Thickness * this.Scale
		var Z = center[2] * this.Scale + L
		var D = circle.Diameter * this.Scale

		var E = parseFloat(parseParameter("E", circle.Layer))
		if (isNaN(E))
			E = this.ColumnsMaterial.E

		var rho = parseFloat(parseParameter("rho", circle.Layer))
		if (isNaN(rho))
			rho = this.ColumnsMaterial.rho

		var nu = parseFloat(parseParameter("nu", circle.Layer))
		if (isNaN(nu))
			nu = this.ColumnsMaterial.nu

		var value =
			"{\r\n" +
			"    Typ =Stuetze\r\n" +
			"    Material ={\r\n" +
			"      rho =" + rho + "\r\n" +
			"      Typ =Параметрическое\r\n" +
			"      Sect =8 " + D + "\r\n" +
			"    }\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Punkt\r\n" +
			"      X =" + X + "\r\n" +
			"      Y =" + Y + "\r\n" +
			"      Alpha =0\r\n" +
			"      Verfeinerung =0\r\n" +
			"    }\r\n" +
			"    Art =Zugfeder\r\n" +
			"    Auflagerung ={\r\n" +
			"      Fg =TransT\r\n" +
			"      Steif =0\r\n" +
			"      l =" + L + "\r\n" +
			"      E-Mod =" + E + "\r\n" +
			"      nue =" + nu + "\r\n" +
			"    }\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =global\r\n" +
			"        Ursprung =0 0 " + Z + "\r\n" +
			"      }\r\n" +
			"    }\r\n"

		var level = new Level(circle.Layer, Z - L, Z)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Добавляет в проект сваю, созданную на основе горизонтального круга
	 * @param {Object} circle Круг (AcDbCircle)
	 */
	this.AddHorisontalCirclePile = function (circle) {
		var id = this.NextPileId()

		var center = Utility.CreateSafeArrayFromVector(circle.Center).toArray()
		var X = center[0] * this.Scale
		var Y = center[1] * this.Scale
		var L = - circle.Thickness * this.Scale
		var Z = center[2] * this.Scale
		var D = circle.Diameter * this.Scale

		var E = parseFloat(parseParameter("E", circle.Layer))
		if (isNaN(E))
			E = this.PilesMaterial.E

		var rho = parseFloat(parseParameter("rho", circle.Layer))
		if (isNaN(rho))
			rho = this.PilesMaterial.rho

		var nu = parseFloat(parseParameter("nu", circle.Layer))
		if (isNaN(nu))
			nu = this.PilesMaterial.nu

		var value =
			"{\r\n" +
			"    Typ =Pile_Hanging\r\n" +
			"    Material ={\r\n" +
			"      Typ =Rundstuetze\r\n" +
			"      Durchmesser =" + D + "\r\n" +
			"      rho =" + rho + "\r\n" +
			"    }\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Punkt\r\n" +
			"      X =" + X + "\r\n" +
			"      Y =" + Y + "\r\n" +
			"      Alpha =0\r\n" +
			"      Verfeinerung =1\r\n" +
			"    }\r\n" +
			"    Art =\r\n" +
			"    Auflagerung ={\r\n" +
			"      Fg =\r\n" +
			"      Steif =\r\n" +
			"      l =" + L + "\r\n" +
			"      E-Mod =" + E + "\r\n" +
			"      nue =" + nu + "\r\n" +
			"    }\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =global\r\n" +
			"        Ursprung =0 0 " + Z + "\r\n" +
			"      }\r\n" +
			"    }\r\n"

		var level = new Level(circle.Layer, Z - L, Z)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Добавляет в проект отверстие, созданное на основе горизонтального отрезка
	 * @param {Object} line Отрезок (AcDbLine)
	 */
	this.AddHorisontalLineHole = function (line) {
		var id = this.NextHoleId()

		var p1 = Utility.CreateSafeArrayFromVector(line.StartPoint).toArray()
		var p2 = Utility.CreateSafeArrayFromVector(line.EndPoint).toArray()

		var dx = p2[0] - p1[0]
		var dy = p2[1] - p1[1]
		var L = Math.sqrt(dx * dx + dy * dy) * this.Scale
		var H = line.Thickness * this.Scale

		var X = p1[0] * this.Scale
		var Y = p1[1] * this.Scale
		var Z = p1[2] * this.Scale

		var P1X = p1[0] * this.Scale
		var P1Y = p1[1] * this.Scale
		var P1Z = p1[2] * this.Scale

		var P2X = p2[0] * this.Scale
		var P2Y = p2[1] * this.Scale
		var P2Z = p2[2] * this.Scale

		var P3X = p1[0] * this.Scale
		var P3Y = p1[1] * this.Scale
		var P3Z = p1[2] * this.Scale + line.Thickness * this.Scale

		var value =
			"{\r\n" +
			"    Typ =Aussparung\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Polygon\r\n" +
			"      X =0 " + L + " " + L + " 0 0 \r\n" +
			"      Y =0 0 " + H + " " + H + " 0 \r\n" +
			"    }\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =3-Punkte\r\n" +
			"        Ursprung =" + X + " " + Y + " " + Z + "\r\n" +
			"        P1 =" + P1X + " " + P1Y + " " + P1Z + "\r\n" +
			"        P2 =" + P2X + " " + P2Y + " " + P2Z + "\r\n" +
			"        P3 =" + P3X + " " + P3Y + " " + P3Z + "\r\n" +
			"      }\r\n" +
			"    }"

		var level = new Level(line.Layer, Z, Z + H)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Добавляет в проект стержень, созданный на основе отрезка
	 * @param {Object} line Отрезок (AcDbLine)
	 */
	this.AddLineRod = function (line) {
		var id = this.NextRodId()

		var p1 = Utility.CreateSafeArrayFromVector(line.StartPoint).toArray()
		var p2 = Utility.CreateSafeArrayFromVector(line.EndPoint).toArray()

		var dx = p2[0] - p1[0]
		var dy = p2[1] - p1[1]
		var dz = p2[2] - p1[2]
		var dxy = Math.sqrt(dx * dx + dy * dy)

		var X = p1[0] * this.Scale
		var Y = p1[1] * this.Scale
		var Z = p1[2] * this.Scale
		var L = Math.sqrt(dx * dx + dy * dy + dz * dz) * this.Scale

		var E = parseFloat(parseParameter("E", line.Layer))
		if (isNaN(E))
			E = this.RodsMaterial.E

		var nu = parseFloat(parseParameter("nu", line.Layer))
		if (isNaN(nu))
			nu = this.RodsMaterial.nu

		var rho = parseFloat(parseParameter("rho", line.Layer))
		if (isNaN(rho))
			rho = this.RodsMaterial.rho

		var G = E / 2 / (1 + nu)

		var alpha = 90 - Math.atan2(dx, dy) / Math.PI * 180
		var beta = 360 - Math.atan2(dz, dxy) / Math.PI * 180
		var gamma = 90

		var value =
			"{\r\n" +
			"    Typ =Стержень\r\n" +
			"    Material ={\r\n" +
			"      Typ =Параметрическое\r\n" +
			"      Sect =8 0.1\r\n" +
			"      E-Mod =" + E + "\r\n" +
			"      Rho =" + rho + "\r\n" +
			"      G-Mod =" + G + "\r\n" +
			"      e =0\r\n" +
			"      Alpha =0\r\n" +
			"    }\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Linienzug\r\n" +
			"      X =0 " + L + "\r\n" +
			"      Y =0 0\r\n" +
			"    }\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =3-Winkel\r\n" +
			"        Ursprung =" + X + " " + Y + " " + Z + "\r\n" +
			"        alpha =" + alpha + "\r\n" +
			"        beta =" + beta + "\r\n" +
			"        gamma =" + gamma + "\r\n" +
			"      }\r\n" +
			"    }\r\n"
				  
		var level = new Level(line.Layer, Math.min(p1[2], p2[2]) * this.Scale, Math.max(p1[2], p2[2]) * this.Scale)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Возвращает заголовок блока позиций для записи в файл
	 * @returns {String}
	 */
	this.GetPositionsHeaderString = function () {
		return "[Positionen]\r\n"
	}

	/**
	 * Возвращает список идентификаторов всех позиций проекта для записи в файл
	 * @returns {String}
	 */
	this.GetPositionsListString = function () {
		var result = "  Pos-Liste ="
		for (var i = 0; i < this.Positions.length; i++)
			result += " " + this.Positions[i].Id
		return result + "\r\n"
	}

	/**
	 * Возвращает текстовое содержимое списка всех позиций проекта для записи в файл
	 * @returns {String}
	 */
	this.GetPositionsString = function () {
		var result = ""
		for (var i = 0; i < this.Positions.length; i++)
			result +=
				"  " + this.Positions[i].Id + " =" + this.Positions[i].Value +
				"    Gruppe =" + this.LevelIdByName(this.Positions[i].levelName) + "\r\n" +
				"  }\r\n"
		return result
	}

	/**
	 * Возвращает заголовок блока этажей для записи в файл
	 * @returns {String}
	 */
	this.GetLevelsHeaderString = function () {
		return "[Gruppen]\r\n"
	}

	/**
	 * Возвращает текстовое содержимое списка всех этажей проекта для записи в файл
	 * @returns {String}
	 */
	this.GetLevelsString = function () {
		var result = ""
		for (var i = 0; i < this.Levels.length; i++) {
			var L = this.Levels[i].L ? this.Levels[i].L : this.Levels[i].Zmax
			var H = this.Levels[i].H ? this.Levels[i].H : this.Levels[i].Zmax - this.Levels[i].Zmin

			// При нулевой высоте этажа Stark вылетает
			if (Math.abs(H) < 1e-3)
				H = 1e-3

			result +=
				"  " + this.LevelIdByIndex(i) + "={\r\n" +
				"    Typ =Geschoss\r\n" +
				"    Sichtbarkeit =1\r\n" +
				"    Geschoss ={\r\n" +
				"      Hoehe =" + H + "\r\n" +
				"      Niveau =" + L + "\r\n" +
				"    }\r\n" +
				"    Bezeichnung =" + this.Levels[i].Name + "\r\n" +
				"    Bemerkung =\r\n" +
				"}\r\n"
		}
		return result
	}

	/**
	 * Возвращает текстовое представление всего проекта для записи в файл
	 * @returns {String}
	 */
	this.toString = function () {
		return	this.GetPositionsHeaderString() +
			this.GetPositionsListString() +
			this.GetPositionsString() +
			this.GetLevelsHeaderString() +
			this.GetLevelsString()
	}
}

/**
 * Возвращает true, если два числа равны в пределах допуска
 * @param {Number} number1 Первое число
 * @param {Number} number2 Второе число
 */
function isEqual(number1, number2) {
	return Math.abs(number1 - number2) < 1e-5
}

/**
 * Возвращает true, если плоскость полилинии горизонтальна
 * @param {Object} polyline Полилиния (AcDbPolyline)
 * @returns {Boolean}
 */
function polylineIsHorisontal(polyline) {
	var Normal = Utility.CreateSafeArrayFromVector(polyline.Normal).toArray()
	return Normal[2] == 1.0
}

/**
 * Возвращает true, если полилиния прямоугольная
 * @param {Object} polyline Полилиния (AcDbPolyline)
 * @returns {Boolean}
 */
function polylineIsRectangular(polyline) {
	var nVerts = (Utility.CreateSafeArrayFromVector(polyline.Coordinates).ubound() + 1) / 2
	if (nVerts != 4) return false

	var v1 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(0)).toArray()
	var v2 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(1)).toArray()
	var v3 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(2)).toArray()
	var v4 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(3)).toArray()

	var dx, dy
	var L1, L2, L3, L4
	var D1, D2

	dx = v2[0] - v1[0]; dy = v2[1] - v1[1]; L1 = Math.sqrt(dx * dx + dy * dy)
	dx = v3[0] - v2[0]; dy = v3[1] - v2[1]; L2 = Math.sqrt(dx * dx + dy * dy)
	dx = v4[0] - v3[0]; dy = v4[1] - v3[1]; L3 = Math.sqrt(dx * dx + dy * dy)
	dx = v1[0] - v4[0]; dy = v1[1] - v4[1]; L4 = Math.sqrt(dx * dx + dy * dy)

	dx = v3[0] - v1[0]; dy = v3[1] - v1[1]; D1 = Math.sqrt(dx * dx + dy * dy)
	dx = v4[0] - v2[0]; dy = v4[1] - v2[1]; D2 = Math.sqrt(dx * dx + dy * dy)

	// Равны противоположные стороны и диагонали
	if (!isEqual(L1, L3)) return false
	if (!isEqual(L2, L4)) return false
	if (!isEqual(D1, D2)) return false
	return true
}

/**
 * Возвращает true, если круг лежит в горизонтальной плоскости
 * @param {Object} circle Круг (AcDbCircle)
 */
function circleIsHorisontal(circle) {
	var Normal = Utility.CreateSafeArrayFromVector(circle.Normal).toArray()
	return Normal[2] == 1.0
}

/**
 * Возвращает true, если отрезок лежит в горизонтальной плоскости
 * @param {Object} line Отрезок (AcDbLine)
 */
function lineIsHorisontal(line) {
	var p1 = Utility.CreateSafeArrayFromVector(line.StartPoint).toArray()
	var p2 = Utility.CreateSafeArrayFromVector(line.EndPoint).toArray()

	return p1[2] == p2[2]
}

/**
 * Возвращает true, если полилиния преобразуется в плиту
 * @param {Object} polyline Полилиния (AcDbPolyline)
 * @returns {Boolean}
 */
function polylineIsSlab(polyline) {
	if (!polylineIsHorisontal(polyline)) return false
	if (!polyline.Closed) return false
	if (polyline.ConstantWidth == 0) return false
	if (polyline.Thickness != 0) return false
	return true
}

/**
 * Возвращает true, если полилиния преобразуется в рампу
 * @param {Object} polyline Полилиния (AcDbPolyline)
 * @returns {Boolean}
 */
function polylineIsRamp(polyline) {
	if (polylineIsHorisontal(polyline)) return false
	if (!polyline.Closed) return false
	if (polyline.ConstantWidth == 0) return false
	return true
}

/**
 * Возвращает true, если полилиния преобразуется в отверстие
 * @param {Object} polyline Полилиния (AcDbPolyline)
 * @returns {Boolean}
 */
function polylineIsHorisontalHole(polyline) {
	if (!polylineIsHorisontal(polyline)) return false
	if (!polyline.Closed) return false
	if (polyline.ConstantWidth != 0) return false
	if (polyline.Thickness != 0) return false
	return true
}

/**
 * Возвращает true, если полилиния преобразуется в стену
 * @param {Object} polyline Полилиния (AcDbPolyline)
 * @returns {Boolean}
 */
function polylineIsHorisontalWall(polyline) {
	if (!polylineIsHorisontal(polyline)) return false
	if (polyline.ConstantWidth == 0) return false
	if (polyline.Thickness <= 0) return false
	return true
}

/**
 * Возвращает true, если полилиния преобразуется в балку
 * @param {Object} polyline Полилиния (AcDbPolyline)
 * @returns {Boolean}
 */
function polylineIsHorisontalBeam(polyline) {
	if (!polylineIsHorisontal(polyline)) return false
	if (polyline.ConstantWidth == 0) return false
	if (polyline.Thickness >= 0) return false
	return true
}

/**
 * Возвращает true, если полилиния преобразуется в колонну
 * @param {Object} polyline Полилиния (AcDbPolyline)
 * @returns {Boolean}
 */
function polylineIsHorisontalColumn(polyline) {
	if (!polylineIsHorisontal(polyline)) return false
	if (!polyline.Closed) return false
	if (polyline.ConstantWidth != 0) return false
	if (polyline.Thickness <= 0) return false
	if (!polylineIsRectangular(polyline)) return false
	return true
}

/**
 * Возвращает true, если полилиния преобразуется в сваю
 * @param {Object} polyline Полилиния (AcDbPolyline)
 * @returns {Boolean}
 */
function polylineIsHorisontalPile(polyline) {
	if (!polylineIsHorisontal(polyline)) return false
	if (!polyline.Closed) return false
	if (polyline.ConstantWidth != 0) return false
	if (polyline.Thickness >= 0) return false
	if (!polylineIsRectangular(polyline)) return false
	return true
}

/**
 * Возвращает true, если круг преобразуется в колонну
 * @param {Object} circle Круг (AcDbCircle)
 * @returns {Boolean}
 */
function circleIsColumn(circle) {
	if (!circleIsHorisontal(circle)) return false
	if (circle.Thickness <= 0) return false
	return true
}

/**
 * Возвращает true, если круг преобразуется в сваю
 * @param {Object} circle Круг (AcDbCircle)
 * @returns {Boolean}
 */
function circleIsPile(circle) {
	if (!circleIsHorisontal(circle)) return false
	if (circle.Thickness >= 0) return false
	return true
}

/**
 * Возвращает true, если отрезок преобразуется в отверстие
 * @param {*} line 
 */
function lineIsVerticalHole(line) {
	if (!lineIsHorisontal(line)) return false
	if (line.Thickness <= 0) return false
	return true
}

/**
 * Возвращает true, если отрезок преобразуется в стержень
 * @param {*} line 
 */
function lineIsRod(line) {
	if (line.Thickness != 0) return false
	return true
}

/**
 * Добавляет в проект объект, созданный из полилинии. Возвращает false, если объект не опознан
 * @param {Object} posProject POS-проект
 * @param {Object} polyline Полилиния (AcDbPolyline)
 */
function AddAcDbPolyline(posProject, polyline) {
	if (polylineIsSlab(polyline)) {
		posProject.AddHorisontalPolylineSlab(polyline)
		return true
	}

	if (polylineIsRamp(polyline)) {
		posProject.AddInclinedPolylineRamp(polyline)
		return true
	}

	if (polylineIsHorisontalHole(polyline)) {
		posProject.AddHorisontalPolylineHole(polyline)
		return true
	}

	if (polylineIsHorisontalWall(polyline)) {
		posProject.AddHorisontalPolylineWall(polyline)
		return true
	}

	if (polylineIsHorisontalBeam(polyline)) {
		posProject.AddHorisontalPolylineBeam(polyline)
		return true
	}

	if (polylineIsHorisontalColumn(polyline)) {
		posProject.AddHorisontalPolylineColumn(polyline)
		return true
	}

	if (polylineIsHorisontalPile(polyline)) {
		posProject.AddHorisontalPolylinePile(polyline)
		return true
	}

	return false
}

/**
 * Добавляет в проект объект, созданный из круга. Возвращает false, если объект не опознан
 * @param {Object} posProject POS-проект
 * @param {Object} circle Круг (AcDbCircle)
 */
function AddAcDbCircle(posProject, circle) {
	if (circleIsColumn(circle)) {
		posProject.AddHorisontalCircleColumn(circle)
		return true
	}

	if (circleIsPile(circle)) {
		posProject.AddHorisontalCirclePile(circle)
		return true
	}

	return false
}

/**
 * Добавляет в проект объект, созданный из отрезка. Возвращает false, если объект не опознан
 * @param {Object} posProject POS-проект
 * @param {Object} line Отрезок (AcDbLine)
 */
function AddAcDbLine(posProject, line) {
	if (lineIsVerticalHole(line)) {
		posProject.AddHorisontalLineHole(line)
		return true
	}

	if (lineIsRod(line)) {
		posProject.AddLineRod(line)
		return true
	}

	return false
}

/**
 * Добавляет в проект объект чертежа. Возвращает false, если объект не опознан
 * @param {Object} posProject POS-проект
 * @param {Object} entity Объект (AcDbEntity)
 */
function AddEntity(posProject, entity) {
	switch (entity.ObjectName) {
		case "AcDbLine":
			return AddAcDbLine(posProject, entity)
		case "AcDbPolyline":
			return AddAcDbPolyline(posProject, entity)
		case "AcDbCircle":
			return AddAcDbCircle(posProject, entity)
	}

	return false
}

/**
 * Взывает блок и все вложенные блоки
 * @param {Object} blockReference Объект (AcDbBlockReference)
 * @param {String} layer Слой родительского блока
 */
function ExplodeBlockReference(blockReference, layer)
{
	// Взрыв блока
	var nestedEntities = blockReference.Explode().toArray()
	blockReference.Delete()

	// Поиск и врыв вложенных блоков
	for(var i = 0; i < nestedEntities.length; i++){
		var entity = nestedEntities[i]

		if(entity.Layer == "0")
			entity.Layer = layer

		if(entity.ObjectName == "AcDbBlockReference") {
			ExplodeBlockReference(entity, entity.layer)
		}		
	}
}

/**
 * Генерирует POS-проект из выбранных объектов чертежа
 * @param {Object} posProject POS-проект
 */
function GenerateProject(posProject)
{
	// Фильтр выбора объектов
	var FilterType = [0]
	var FilterData = ["CIRCLE,LINE,LWPOLYLINE,INSERT"]

	FilterType = Utility.CreateTypedArrayFromJSArray(2, FilterType)
	FilterData = Utility.CreateTypedArrayFromJSArray(8, FilterData)

	// Выбор объектов
	Utility.Prompt("Экспорт в файл позиционной модели Stark ES")
	ActiveSelectionSet.SelectOnScreen(FilterType, FilterData)

	// Копирование выбраннх объектов во временную базу данных
	var tempDatabase = Utility.NewDatabase()
	var selectionArray = new Array()
	for(var i = 0; i < ActiveSelectionSet.Count; i++)
		selectionArray.push(ActiveSelectionSet.Item(i))
	selectionArray = Utility.CreateTypedArrayFromJSArray(8, selectionArray)
	ThisDrawing.CopyObjects(selectionArray, tempDatabase.ModelSpace)

	// Создание списка блоков
	var blockReferences = new Array()
	for(var i = 0; i < tempDatabase.ModelSpace.Count; i++) {
		var entity = tempDatabase.ModelSpace.Item(i)
		if(entity.ObjectName == "AcDbBlockReference")
			blockReferences.push(entity)
	}

	// Взрыв блоков
	for(var i = 0; i < blockReferences.length; i++) {
		var blockReference = blockReferences[i]
		ExplodeBlockReference(blockReference, blockReference.Layer)
	}

	// Добавление объектов в проект
	var entitiesProcessed = 0
	for (var i = 0; i < tempDatabase.ModelSpace.Count; i++)
		if(AddEntity(posProject, tempDatabase.ModelSpace.Item(i)))
			entitiesProcessed++
	Utility.Prompt("Обработано объектов: " + entitiesProcessed + " из " + tempDatabase.ModelSpace.Count)

	// Сброс выделения
	ActiveSelectionSet.Clear()
}

/**
 * Возвращает имя файла, полученное от пользователя
 * @param {Object} fso Объект FileSystemObject
 * @param {String} defaultDirName Начальный путь для диалогового окна
 */
function GetFileName(fso, defaultDirName) {
	var chooseAllowNonexistent = 256
	var popupYesNoCancel = 3, popupExclamation = 48
	var popupCancel = 2, popupYes = 6, popupNo = 7

	var filename = ""
	var shell = new ActiveXObject("WScript.Shell")

	for (;;) {
		filename = Utility.ChooseFile("file", "Stark ES POS project|*.pos|Все файлы|*.*", chooseAllowNonexistent, defaultDirName)

		if (!filename)
			return ""

		if (fso.GetExtensionName(filename).toLowerCase() != "pos")
			filename += ".pos"

		if (fso.FileExists(filename)) {
			var userChoice = shell.Popup(filename + "\r\nФайл уже существует. Заменить?", 0, "Подтвердить сохранение", popupYesNoCancel + popupExclamation)
			switch (userChoice) {
				case popupYes:
					return filename
				case popupCancel:
					return ""
			}
		} else
			return filename

		defaultDirName = fso.GetParentFolderName(filename)
	}
}

/**
 * Экспортирует проект в файл, запрошенный у пользователя
 * @param {Object} posProject POS-проект
 * @param {String} defaultDirName Начальный путь для диалогового окна
 */
function ExportProject(posProject, defaultDirName)
{
	// Объект доступа к файловой системе
	var fso = new ActiveXObject("Scripting.FileSystemObject")
	
	// Запрос имени файла
	var filename = GetFileName(fso, defaultDirName)
	
	// Запись файла
	if (filename) {
		var file = fso.OpenTextFile(filename, 2, true)
		file.Write(posProject.toString())
	}
}

// Масштабный множитель
var Scale = 0.001

// Материалы по умолчанию
var SlabsMaterial   = new Material(0.90e7, 0.2, 2.75)
var RampsMaterial   = new Material(0.90e7, 0.2, 2.75)
var WallsMaterial   = new Material(1.80e7, 0.2, 2.75)
var BeamsMaterial   = new Material(0.90e7, 0.2, 2.75)
var ColumnsMaterial = new Material(1.80e7, 0.2, 2.75)
var PilesMaterial   = new Material(1.80e7, 0.2, 2.75)
var RodsMaterial    = new Material(2.06e8, 0.3, 8.2425)

// Папка для сохранения по умолчанию
var defaultDirName = "C:\\Eurosoft\\Stark\\Daten\\FEM"

// Создание, генерация и экспорт содержимого позиционного проекта Stark ES
var posProject = new StarkPosProject(Scale, SlabsMaterial, RampsMaterial, WallsMaterial, BeamsMaterial, ColumnsMaterial, PilesMaterial, RodsMaterial)
GenerateProject(posProject)
ExportProject(posProject, defaultDirName)
Экспорт нагрузок:
Код:
[Выделить все]
/**
 * Экспорт нагрузок из nanoCAD в позиционный проект Stark ES
 * Настройки масштаба и пути для сохранения по умолчанию - в конце файла
 *	Слои конвертируются в этажи
 *	Горизонтальные замкнутые полилинии с 3D-высотой - в плоскостные нагрузки. Значение нагрузки равно высоте.
 *	Горизонтальные отрезки с 3D-высотой - в линейные нагрузки. Значение нагрузки равно высоте.
 *	Точки с 3D-высотой - в сосредоточенные нагрузки. Значение нагрузки равно высоте.
 * В конце имени слоя в круглых скобках можно записать параметры в виде: 
 * Нагрузки. Этаж 1 (LF 2)
 *	LF - номер загружения
 *	При записи проекта скобки с параметрами будут удалены из имени этажа
 */

/**
 * Возвращает значение парметра, записанного в скобках в имени слоя, или null
 * @param {String} parameter Имя параметра, значение которого разыскивается
 * @param {String} layerName Имя слоя с парметром в скобках
 */
function parseParameter(parameter, layerName) {
	// Поиск значения параметра внутри скобок
	var re = new RegExp("[(].*" + parameter + " +([^ ]+)" + ".*[)]")
	return re.exec(layerName) ? RegExp.$1 : null;
}

/**
 * Создает экземпляр уровня по имени слоя
 * @constructor
 * @param {String} layerName Имя слоя
 */
function Level(layerName, zmin, zmax) {
	// Установка параметров
	var L = parseFloat(parseParameter("L", layerName))
	if (!isNaN(L))
		this.L = L

	var H = parseFloat(parseParameter("H", layerName))
	if (!isNaN(H))
		this.H = H

	this.Zmax = zmax
	this.Zmin = zmin

	// Удаление скобок с параметрами
	var re = new RegExp("[ ]*[(].*[)]")
	this.Name = layerName.replace(re, "")

	/**
	 * Дополняет старое определение уровня по копии того же уровня, созданной из другого имени слоя. Имена уровней должны совпадать.
	 * @param {Object} level Уровень, созданный на основе другого слоя, возможно, с другими параметрами.
	 */
	this.Merge = function (level) {
		if (level.L)
			if (this.L)
				this.L = Math.max(this.L, level.L)
			else
				this.L = level.L

		if (level.H)
			if (this.H)
				this.H = Math.max(this.H, level.H)
			else
				this.H = level.H

		this.Zmax = Math.max(this.Zmax, level.Zmax)
		this.Zmin = Math.min(this.Zmin, level.Zmin)
	}
}

/**
 * Создает экземпляр позиции для записи в файл проекта
 * @constructor
 * @param {String} id Идентификатор позиции ("LILA-1", ...)
 * @param {String} value Текстовое содержимое для экспорта в файл, кроме строк с идентификатором и этажом
 * @param {String} levelName Имя этажа
 */
function StarkPosition(id, value, levelName) {
	this.Id = id
	this.Value = value
	this.levelName = levelName
}

/**
 * Создает экземпляр позиционного проекта Stark
 * @constructor
 * @param {Number} Scale Масштабный множитель для геометрических размеров.
 */
function StarkPosProject(Scale) {
	this.Scale = Scale

	// Список всех позиций в проекте
	this.Positions = new Array()

	// Список всех этажей в проекте
	this.Levels = new Array()

	// Счетчики позиций для генерации номера следующей позиции
	this.SurfaceLoadsCount = 0
	this.LinearLoadsCount = 0
	this.ConcentratedLoadsCount = 0

	/**
	 * Возвращает следующий незанятый идентификатор поверхностной нагрузки
	 * @returns {String}
	 */
	this.NextSurfaceLoadId = function () {
		return "FLLA-" + ++this.SurfaceLoadsCount
	}

	/**
	 * Возвращает следующий незанятый идентификатор линейной нагрузки
	 * @returns {String}
	 */
	this.NextLinearLoadId = function () {
		return "LILA-" + ++this.LinearLoadsCount
	}

	/**
	 * Возвращает следующий незанятый идентификатор сосредоточенной нагрузки
	 * @returns {String}
	 */
	this.NextConcentratedLoadId = function () {
		return "PULA-" + ++this.ConcentratedLoadsCount
	}

	/**
	 * Возвращает идентификатор этажа по индексу в массиве этажей
	 * @param {Number} i Индекс в массиве этажей
	 * @returns {String}
	 */
	this.LevelIdByIndex = function (i) {
		return "EBENE-" + (i + 1)
	}

	/**
	 * Возвращает идентификатор этажа по имени. Предполагается, что этаж с таким именем уже был добавлен.
	 * @param {String} name Имя этажа
	 * @returns {String}
	 */
	this.LevelIdByName = function (name) {
		if (this.Levels.length < 2)
			return this.LevelIdByIndex(0)

		var min = 0
		var max = this.Levels.length - 1
		var curr = Math.floor((min + max) / 2)

		// Поиск по массиву этажей
		while (min < max) {
			if (name == this.Levels[curr].Name)
				break
			if (name > this.Levels[curr].Name)
				min = curr + 1
			if (name < this.Levels[curr].Name)
				max = curr
			curr = Math.floor((min + max) / 2)
		}

		return this.LevelIdByIndex(curr)
	}

	/**
	 * Добавляет этаж в список этажей проекта в алфавитном порядке. Добавляются только новые этажи. Существующие объединяются
	 * @param {Object} level 
	 */
	this.AddLevel = function (level) {
		var min = 0
		var max = this.Levels.length
		var curr = Math.floor((min + max) / 2)

		// Поиск позиции для вставки нового этажа
		while (min < max) {
			if (level.Name == this.Levels[curr].Name) {
				this.Levels[curr].Merge(level)
				return
			}
			if (level.Name > this.Levels[curr].Name)
				min = curr + 1
			if (level.Name < this.Levels[curr].Name)
				max = curr
			curr = Math.floor((min + max) / 2)
		}

		this.Levels.splice(curr, 0, level)
	}

	/**
	 * Создает и добавляет новую позицию в список позиций проекта
	 * @param {String} id Идентификатор позиции
	 * @param {String} value Текстовое представление позиции, кроме строк с идентификатором и этажом
	 * @param {String} levelName Имя этажа
	 */
	this.AddPosition = function (id, value, levelName) {
		this.Positions.push(new StarkPosition(id, value, levelName))
	}

	/**
	 * Добавляет в проект поверхностную нагрузку, созданную на основе горизонтальной полилинии
	 * @param {Object} polyline Полилиния (AcDbPolyline)
	 */
	this.AddHorisontalPolylineSurfaceLoad = function (polyline) {
		var id = this.NextSurfaceLoadId()
		var X = ""
		var Y = ""

		var vertex = Utility.CreateSafeArrayFromVector(polyline.Coordinate(0)).toArray()
		var X0 = vertex[0] * this.Scale
		var Y0 = vertex[1] * this.Scale
		var Z0 = polyline.Elevation * this.Scale

		var nVerts = (Utility.CreateSafeArrayFromVector(polyline.Coordinates).ubound() + 1) / 2
		for (var i = 0; i < nVerts; i++) {
			var vertex = Utility.CreateSafeArrayFromVector(polyline.Coordinate(i)).toArray()
			X += vertex[0] * this.Scale - X0 + " "
			Y += vertex[1] * this.Scale - Y0 + " "
		}

		var LF = parseFloat(parseParameter("LF", polyline.Layer))
		if (isNaN(LF))
			LF = 2

		var Pz = polyline.Thickness

		var value =
			"{\r\n" +
			"    Typ =Flaechenlast\r\n" +
			"    LF =" + LF + "\r\n" +
			"    FG =3\r\n" +
			"    Art =lokal\r\n" +
			"    Gen =0\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Polygon\r\n" +
			"      X =" + X + "\r\n" +
			"      Y =" + Y + "\r\n" +
			"    }\r\n" +
			"    Last =" + Pz + ", "+ Pz + ", " + Pz + "\r\n" +
			"    Text =Trapezlast\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =3-Punkte\r\n" +
			"        Ursprung =" + X0 + " " + Y0 + " " + Z0 + "\r\n" +
			"        P1 =0.000000 0.000000 0.000000\r\n" +
			"        P2 =1.000000 0.000000 0.000000\r\n" +
			"        P3 =0.000000 1.000000 0.000000\r\n" +
			"      }\r\n" +
			"    }\r\n"

		var level = new Level(polyline.Layer, Z0, Z0)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Добавляет в проект линейную нагрузку, созданную на основе горизонтального отрезка
	 * @param {Object} line Полилиния (AcDbLine)
	 */
	this.AddHorisontalLineLinearLoad = function (line) {
		var id = this.NextLinearLoadId()

		var p1 = Utility.CreateSafeArrayFromVector(line.StartPoint).toArray()
		var p2 = Utility.CreateSafeArrayFromVector(line.EndPoint).toArray()

		var dx = p2[0] - p1[0]
		var dy = p2[1] - p1[1]
		var Length = Math.sqrt(dx * dx + dy * dy) * this.Scale
		var H = line.Thickness * this.Scale

		var X = p1[0] * this.Scale
		var Y = p1[1] * this.Scale
		var Z = p1[2] * this.Scale

		var P1X = p1[0] * this.Scale
		var P1Y = p1[1] * this.Scale
		var P1Z = p1[2] * this.Scale

		var P2X = p2[0] * this.Scale
		var P2Y = p2[1] * this.Scale
		var P2Z = p2[2] * this.Scale

		var P3X = p1[0] * this.Scale
		var P3Y = p1[1] * this.Scale
		var P3Z = p1[2] * this.Scale + 1

		var LF = parseFloat(parseParameter("LF", line.Layer))
		if (isNaN(LF))
			LF = 2

		var Pz = line.Thickness

		var value =
			"{\r\n" +
			"    Typ =Linienlast\r\n" +
			"    Art =global\r\n" +
			"    LF =" + LF + "\r\n" +
			"    FG =3\r\n" +
			"    Gen =0\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Polygon\r\n" +
			"      X =0 " + Length + " \r\n" +
			"      Y =0 0 \r\n" +
			"    }\r\n" +
			"    Last =" + Pz + ", " + Pz + "\r\n" +
			"    Text =\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =3-Punkte\r\n" +
			"        Ursprung =" + X + " " + Y + " " + Z + "\r\n" +
			"        P1 =" + P1X + " " + P1Y + " " + P1Z + "\r\n" + 
			"        P2 =" + P2X + " " + P2Y + " " + P2Z + "\r\n" +
			"        P3 =" + P3X + " " + P3Y + " " + P3Z + "\r\n" +
			"      }\r\n" +
			"    }\r\n"

		var level = new Level(line.Layer, Z, Z)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Добавляет в проект сосредоточенную нагрузку, созданную на основе точки
	 * @param {Object} point Точка (AcDbPoint)
	 */
	this.AddPointConcentratedLoad = function (point) {
		var id = this.NextConcentratedLoadId()

		var p = Utility.CreateSafeArrayFromVector(point.Coordinates).toArray()

		var X = p[0] * this.Scale
		var Y = p[1] * this.Scale
		var Z = p[2] * this.Scale

		var LF = parseFloat(parseParameter("LF", point.Layer))
		if (isNaN(LF))
			LF = 2

		var Pz = point.Thickness

		var value =
			"{\r\n" +
			"    Typ =Punktlast\r\n" +
			"    Art =global\r\n" +
			"    LF =" + LF + "\r\n" +
			"    FG =3\r\n" +
			"    Gen =0\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Punkt\r\n" +
			"      X =0\r\n" +
			"      Y =0\r\n" +
			"    }\r\n" +
			"    Last =" + Pz + "\r\n" +
			"    Text =\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =global\r\n" +
			"        Ursprung =" + X + " " + Y + " " + Z + "\r\n" +
			"      }\r\n" +
			"    }\r\n"

		var level = new Level(point.Layer, Z, Z)
		this.AddPosition(id, value, level.Name)
		this.AddLevel(level)
	}

	/**
	 * Возвращает заголовок файла с условной геометрией для записи в файл (без геометрии файл не откроется)
	 * @returns {String}
	 */
	this.GetFileHeaderString = function () {
		return 	"[Positionen]\r\n" +
			"  Pos-Liste =RB-1 RB-2 RB-3 \r\n" +
			"  RB-1 ={\r\n" +
			"    Typ =Einzelfundament\r\n" +
			"    Art =\r\n" +
			"    Fg =\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Punkt\r\n" +
			"      X =0\r\n" +
			"      Y =0\r\n" +
			"    }\r\n" +
			"    Steifigkeiten =\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =global\r\n" +
			"        Ursprung =0.000000 0.000000 0.000000\r\n" +
			"      }\r\n" +
			"    }\r\n" +
			"    Gruppe =EBENE-1\r\n" +
			"  }\r\n" +
			"  RB-2 ={\r\n" +
			"    Typ =Einzelfundament\r\n" +
			"    Art =\r\n" +
			"    Fg =\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Punkt\r\n" +
			"      X =1\r\n" +
			"      Y =0\r\n" +
			"    }\r\n" +
			"    Steifigkeiten =\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =global\r\n" +
			"        Ursprung =0.000000 0.000000 0.000000\r\n" +
			"      }\r\n" +
			"    }\r\n" +
			"    Gruppe =EBENE-1\r\n" +
			"  }\r\n" +
			"  RB-3 ={\r\n" +
			"    Typ =Einzelfundament\r\n" +
			"    Art =\r\n" +
			"    Fg =\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Punkt\r\n" +
			"      X =0\r\n" +
			"      Y =1\r\n" +
			"    }\r\n" +
			"    Steifigkeiten =\r\n" +
			"    Oberflaeche ={\r\n" +
			"      Typ =Ebene\r\n" +
			"      Loks ={\r\n" +
			"        Typ =global\r\n" +
			"        Ursprung =0.000000 0.000000 0.000000\r\n" +
			"      }\r\n" +
			"    }\r\n" +
			"    Gruppe =EBENE-1\r\n" +
			"  }\r\n"
	}

	/**
	 * Возвращает заголовок блока позиций для записи в файл
	 * @returns {String}
	 */
	this.GetPositionsHeaderString = function () {
		return "[Belastung]\r\n"
	}

	/**
	 * Возвращает список идентификаторов всех позиций проекта для записи в файл
	 * @returns {String}
	 */
	this.GetPositionsListString = function () {
		var result = "  Last-Liste ="
		for (var i = 0; i < this.Positions.length; i++)
			result += " " + this.Positions[i].Id
		return result + "\r\n"
	}

	/**
	 * Возвращает текстовое содержимое списка всех позиций проекта для записи в файл
	 * @returns {String}
	 */
	this.GetPositionsString = function () {
		var result = ""
		for (var i = 0; i < this.Positions.length; i++)
			result +=
				"  " + this.Positions[i].Id + " =" + this.Positions[i].Value +
				"    Gruppe =" + this.LevelIdByName(this.Positions[i].levelName) + "\r\n" +
				"  }\r\n"
		return result
	}

	/**
	 * Возвращает заголовок блока этажей для записи в файл
	 * @returns {String}
	 */
	this.GetLevelsHeaderString = function () {
		return "[Gruppen]\r\n"
	}

	/**
	 * Возвращает текстовое содержимое списка всех этажей проекта для записи в файл
	 * @returns {String}
	 */
	this.GetLevelsString = function () {
		var result = ""
		for (var i = 0; i < this.Levels.length; i++) {
			var L = this.Levels[i].L ? this.Levels[i].L : this.Levels[i].Zmax
			var H = this.Levels[i].H ? this.Levels[i].H : this.Levels[i].Zmax - this.Levels[i].Zmin

			// При нулевой высоте этажа Stark вылетает
			if (Math.abs(H) < 1e-3)
				H = 1e-3

			result +=
				"  " + this.LevelIdByIndex(i) + "={\r\n" +
				"    Typ =Geschoss\r\n" +
				"    Sichtbarkeit =1\r\n" +
				"    Geschoss ={\r\n" +
				"      Hoehe =" + H + "\r\n" +
				"      Niveau =" + L + "\r\n" +
				"    }\r\n" +
				"    Bezeichnung =" + this.Levels[i].Name + "\r\n" +
				"    Bemerkung =\r\n" +
				"}\r\n"
		}
		return result
	}

	/**
	 * Возвращает текстовое представление всего проекта для записи в файл
	 * @returns {String}
	 */
	this.toString = function () {
		return	this.GetFileHeaderString() +
			this.GetPositionsHeaderString() +
			this.GetPositionsListString() +
			this.GetPositionsString() +
			this.GetLevelsHeaderString() +
			this.GetLevelsString()
	}
}

/**
 * Возвращает true, если два числа равны в пределах допуска
 * @param {Number} number1 Первое число
 * @param {Number} number2 Второе число
 */
function isEqual(number1, number2) {
	return Math.abs(number1 - number2) < 1e-5
}

/**
 * Возвращает true, если плоскость полилинии горизонтальна
 * @param {Object} polyline Полилиния (AcDbPolyline)
 * @returns {Boolean}
 */
function polylineIsHorisontal(polyline) {
	var Normal = Utility.CreateSafeArrayFromVector(polyline.Normal).toArray()
	return Normal[2] == 1.0
}

/**
 * Возвращает true, если отрезок лежит в горизонтальной плоскости
 * @param {Object} line Отрезок (AcDbLine)
 */
function lineIsHorisontal(line) {
	var p1 = Utility.CreateSafeArrayFromVector(line.StartPoint).toArray()
	var p2 = Utility.CreateSafeArrayFromVector(line.EndPoint).toArray()

	return p1[2] == p2[2]
}

/**
 * Возвращает true, если полилиния преобразуется в горизонтальную поверхностную нагрузку
 * @param {Object} polyline Полилиния (AcDbPolyline)
 * @returns {Boolean}
 */
function polylineIsHorisontalSurfaceLoad(polyline) {
	if (!polylineIsHorisontal(polyline)) return false
	if (!polyline.Closed) return false
	if (polyline.Thickness == 0) return false
	return true
}

/**
 * Возвращает true, если полилиния преобразуется в горизонтальную линейную нагрузку
 * @param {Object} polyline Полилиния (AcDbPolyline)
 * @returns {Boolean}
 */
function polylineIsHorisontalLinearLoad(polyline) {
	if (!polylineIsHorisontal(polyline)) return false
	if (polyline.Closed) return false
	if (polyline.Thickness == 0) return false
	return true
}

/**
 * Возвращает true, если отрезок преобразуется в линейную нагрузку
 * @param {*} line 
 */
function lineIsHorisontalLinearLoad(line) {
	if (!lineIsHorisontal(line)) return false
	if (line.Thickness == 0) return false
	return true
}

/**
 * Возвращает true, если точка преобразуется в сосредоточенную нагрузку
 * @param {*} point
 */
function pointIsConcentratedLoad(point) {
	if (point.Thickness == 0) return false
	return true
}

/**
 * Добавляет в проект объекты, созданные из полилиний
 * @param {Object} posProject POS-проект
 * @param {Object} polyline Полилиния (AcDbPolyline)
 */
function AddAcDbPolyline(posProject, polyline) {
	if (polylineIsHorisontalSurfaceLoad(polyline)) {
		posProject.AddHorisontalPolylineSurfaceLoad(polyline)
		return true
	}

	return false
}

/**
 * Добавляет в проект объекты, созданные из отрезков
 * @param {Object} posProject POS-проект
 * @param {Object} line Отрезок (AcDbLine)
 */
function AddAcDbLine(posProject, line) {
	if (lineIsHorisontalLinearLoad(line)) {
		posProject.AddHorisontalLineLinearLoad(line)
		return true
	}

	return false
}

/**
 * Добавляет в проект объекты, созданные из точек
 * @param {Object} posProject POS-проект
 * @param {Object} point Отрезок (AcDbPoint)
 */
function AddAcDbPoint(posProject, point) {
	if (pointIsConcentratedLoad(point)) {
		posProject.AddPointConcentratedLoad(point)
		return true
	}

	return false
}

/**
 * Добавляет в проект объекты объекты чертежа
 * @param {Object} posProject POS-проект
 * @param {Object} entity Объект (AcDbEntity)
 */
function AddEntity(posProject, entity) {
	switch (entity.ObjectName) {
		case "AcDbPolyline":
			return AddAcDbPolyline(posProject, entity)
		case "AcDbLine":
			return AddAcDbLine(posProject, entity)
		case "AcDbPoint":
			return AddAcDbPoint(posProject, entity)
	}

	return false
}

/**
 * Возвращает имя файла, полученное от пользователя
 * @param {Object} fso Объект FileSystemObject
 * @param {String} defaultDirName Начальный путь диалогового окна
 */
function GetFileName(fso, defaultDirName) {
	var chooseAllowNonexistent = 256
	var popupYesNoCancel = 3, popupExclamation = 48
	var popupCancel = 2, popupYes = 6, popupNo = 7

	var filename = ""
	var shell = new ActiveXObject("WScript.Shell")

	for (;;) {
		filename = Utility.ChooseFile("file", "Stark ES POS project|*.pos|Все файлы|*.*", chooseAllowNonexistent, defaultDirName)

		if (!filename)
			return ""

		if (fso.GetExtensionName(filename).toLowerCase() != "pos")
			filename += ".pos"

		if (fso.FileExists(filename)) {
			var userChoice = shell.Popup(filename + "\r\nФайл уже существует. Заменить?", 0, "Подтвердить сохранение", popupYesNoCancel + popupExclamation)
			switch (userChoice) {
				case popupYes:
					return filename
				case popupCancel:
					return ""
			}
		} else
			return filename

		defaultDirName = fso.GetParentFolderName(filename)
	}
}

// Фильтр выбора объектов
var FilterType = [0]
var FilterData = ["LINE,LWPOLYLINE,POINT"]

FilterType = Utility.CreateTypedArrayFromJSArray(2, FilterType)
FilterData = Utility.CreateTypedArrayFromJSArray(8, FilterData)

// Выбор объектов
Utility.Prompt("Экспорт в файл позиционной модели Stark ES")
ActiveSelectionSet.SelectOnScreen(FilterType, FilterData)

// Настройка и создание позиционного проекта Stark ES
// Масштабный множитель
var Scale = 0.001
var posProject = new StarkPosProject(Scale)

// Добавление выбранных объектов в проект
var entitiesProcessed = 0
for (var i = 0; i < ActiveSelectionSet.Count; i++)
	if(AddEntity(posProject, ActiveSelectionSet.Item(i)))
		entitiesProcessed++
Utility.Prompt("Обработано объектов: " + entitiesProcessed + " из " + ActiveSelectionSet.Count)

// Экспорт проекта
var fso = new ActiveXObject("Scripting.FileSystemObject")
// Папка для сохранения по умолчанию
var defaultDirName = "C:\\Eurosoft\\Stark\\Daten\\FEM"
// Запрос имени файла
var filename = GetFileName(fso, defaultDirName)
// Запись файла
if (filename) {
	var file = fso.OpenTextFile(filename, 2, true)
	file.Write(posProject.toString())
}

// Сброс выделения
ActiveSelectionSet.Clear()

Миниатюры
Нажмите на изображение для увеличения
Название: nanoCAD.png
Просмотров: 568
Размер:	11.0 Кб
ID:	219097  Нажмите на изображение для увеличения
Название: Stark.POS.png
Просмотров: 573
Размер:	21.9 Кб
ID:	219098  Нажмите на изображение для увеличения
Название: Stark.FEA.png
Просмотров: 566
Размер:	30.8 Кб
ID:	219099  

Вложения
Тип файла: dwg
DWG 2000
ExportPOS.dwg (152.0 Кб, 43 просмотров)


Последний раз редактировалось Нубий-IV, 14.10.2020 в 13:49. Причина: Обновление программы
Просмотров: 9130
 
Непрочитано 26.05.2019, 17:50
#2
румата


 
Регистрация: 06.04.2015
Сообщений: 2,673


Ничего не понятно. У Старка появился API?
румата вне форума  
 
Непрочитано 26.05.2019, 18:08
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,772


И в чем собственно вопрос? Или теме место в "Готовых программах"?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.05.2019, 22:04
#4
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


на dotNET'e это сильно проще делается...
trir вне форума  
 
Непрочитано 27.05.2019, 01:23
#5
Ayvengo

Что посеет человек, то и пожнет
 
Регистрация: 31.01.2012
Электросталь
Сообщений: 2,078
<phrase 1= Отправить сообщение для Ayvengo с помощью Skype™


Цитата:
Сообщение от trir Посмотреть сообщение
на dotNET'e это сильно проще делается...
А у Вас есть такой опыт перевода модели в Старк?
Ayvengo вне форума  
 
Автор темы   Непрочитано 27.05.2019, 02:31
#6
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,858


Цитата:
Сообщение от румата Посмотреть сообщение
У Старка появился API?
У Старка все данные хранятся в простом текстовом формате, такой файл легко записать.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
И в чем собственно вопрос? Или теме место в "Готовых программах"?
Есть желание кое-что доделать. Может, высоты этажей в названии слоя задавать (как в поэтажных планах для Лиры), а может - автоматически по геометрии объектов на слое вычислять. Может, материалы в название слоя записывать вроде "Колонны E=3e7 nu=0.2". Скорее всего, скрипт еще серьезно поправлю пару-тройку раз, и весь вопрос пока в полезных советах и пожеланиях.

Если такое недоделанное творчество в готовых программах может лежать - можно перенести тему.
Цитата:
Сообщение от trir Посмотреть сообщение
на dotNET'e это сильно проще делается...
Пробовал писать под кады на VBA, Javascript, C#, LISP, C++. По моим ощущениям - чем ближе к концу этого списка, тем больше посторонней писанины и дольше работа. VBA в nanoCADе нет (доступ через офис не в счет), так что пока VSCode+Javascript в лидерах.

Кстати, под NET есть какая-нибудь библиотека для чтения IFC? Скрипт - это временная полумера. Архитекторы у нас в архикаде работают, хочется сразу геометрию в проект переводить, без промежуточного черчения.
Нубий-IV на форуме  
 
Непрочитано 27.05.2019, 03:59
1 | #7
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
Кстати, под NET есть какая-нибудь библиотека для чтения IFC?
xBIM

Цитата:
А у Вас есть такой опыт перевода модели в Старк?
у меня есть опыт записи текстовых файлов
trir вне форума  
 
Автор темы   Непрочитано 10.06.2019, 13:33
#8
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,858


Обновил программу в шапке темы. Добавлено:
  • Автоматическое вычисление уровня и высоты этажей на основе геометрии объектов.
  • Возможность задавать дополнительные параметры в имени слоя (см. комментарии в начале скрипта и пример во вложении)
  • Запрос на перезапись файла
Дальнейшую доработку не планирую. Тему можно переносить в готовые программы.
Нубий-IV на форуме  
 
Автор темы   Непрочитано 20.10.2019, 14:26
1 | #9
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,858


Программа обновлена.
  • Можно задавать рампы
  • Можно задавать стержни (сечение неуправляемое, исправлять в Stark)
  • Можно задавать постоянную и временную нагрузку для стен, плит и рамп
  • Добавлен отчет о количестве обработанных объектов. Если их меньше, чем выбранных - значит, часть данных задана неверно и экспорт был неполный. Когда найду, как после скрипта оставить выбранные неопознанные объекты - переделаю по-человечески.
Нубий-IV на форуме  
 
Непрочитано 02.11.2019, 20:28
#10
CEBEP


 
Регистрация: 27.06.2008
Сообщений: 313


Поясните,пожалуйста,как с этим работать?
CEBEP вне форума  
 
Автор темы   Непрочитано 03.11.2019, 03:35
#11
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,858


Примерно так:

Или сделать свои кнопки / менюшки: Настройка среды nanoCAD для опытных пользователей
Миниатюры
Нажмите на изображение для увеличения
Название: Export.gif
Просмотров: 472
Размер:	744.7 Кб
ID:	219623  
Нубий-IV на форуме  
 
Автор темы   Непрочитано 14.02.2020, 17:40
1 | #12
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,858


Обновление.
  • Убрано дурацкое ограничение: стена теперь может задаваться замкнутой полилинией.
    Например, наружная стена или лестничная клетка, начерченная командой "прямоугольник", теперь экспортируется, а не теряется.
  • Добавлена обработка блоков. Если содержимое блока лежало в слое "0", оно перемещается в слой блока (по аналогии с цветом).
    Например, можно начертить колонну в слое "0", создать блок и скопировать его на разные слои. При экспорте, когда слои превращаются в этажи, колонны попадут каждая на свой этаж, а не все на один этаж "0", как раньше, при взрыве блоков перед экспортом вручную.
  • Добавлен экспорт нагрузок.
    Поскольку прямоугольник, обозначающий стену, не отличается от прямоугольника, обозначающего нагрузку, экспорт нагрузок делается вторым скриптом. Приходится отдельно экспортировать геометрию, отдельно - нагрузки, и собирать все окончательно в Stark через слияние проектов. В файле с нагрузками при экспорте создаются три точечные опоры: Stark не открывает файл, в котором есть только нагрузки, но нет геометрии; после слияния опоры можно удалить.
P.S. Кто пишет под кады на VB или LISP через vlax-*, подскажите, плз. Обработка со взрывом блоков у меня сделана через копирование выделенного в новую временную базу данных чертежа. После завершения работы ее надо удалять вручную, или она это делает сама? Явных методов типа Delete() я не нашел.
Нубий-IV на форуме  
 
Автор темы   Непрочитано 14.10.2020, 14:27
1 | #13
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,858


Обновление.
  • Добавлена возможность задавать начало шаблона сетки КЭ (параметры x, y). Можно задавать аккуратную сетку возле колонн.
  • Добавлена возможность включать упругое основание для плит (параметр Ground). Теперь не нужно при каждом экспорте ставить заново галочки для фундаментов в POS проекте.
Миниатюры
Нажмите на изображение для увеличения
Название: nanoCAD.png
Просмотров: 332
Размер:	88.2 Кб
ID:	231002  Нажмите на изображение для увеличения
Название: Pos.png
Просмотров: 336
Размер:	82.3 Кб
ID:	231003  Нажмите на изображение для увеличения
Название: Fea.pos.png
Просмотров: 332
Размер:	74.4 Кб
ID:	231004  
Вложения
Тип файла: dwg
DWG 2000
Test.dwg (293.3 Кб, 33 просмотров)
Нубий-IV на форуме  
 
Непрочитано 15.10.2020, 15:37
#14
Техподдержка ЕВРОСОФТ


 
Регистрация: 05.02.2020
Сообщений: 231


Нубий-IV, разработка подойдет для последних версий nanoCAD?
Техподдержка ЕВРОСОФТ вне форума  
 
Автор темы   Непрочитано 15.10.2020, 16:53
#15
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,858


Не могу проверить. Мы сидим в пятом нанокаде за его бесплатность, и закупать новые версии не собираемся. Так что даже демок для посмотреть у меня нет - бессмысленно.

Видел в интернетах сообщения, что и автокад на яваскрипте автоматизируется. Возможно, после легкой доработки скрипты и в автокаде заработают. Скорее всего, надо только функции преобразования типов, вроде CreateSafeArrayFromVector, заменить. Потому что остальная объектная модель явно автокадовская, даже глюк с невозможностью проверки нажатого ESC при вводе точно такой же, как был в VBA. Но для меня и в автокаде ковыряться бессмысленно - у нас его нет и не будет.

Вообще новые данные уже просто некуда записывать, на все свойств объектов не хватает. А сотни слоев делать неудобно. Даже то, что объекты на заблокированных слоях скриптовыми функциями выбора игнорируются, сильно мешает работать. Так и тянет на C# это все перевести, с настоящими объектами - стенами, колоннами и т.п. Вроде как Multicad.NET обещает, что такие объекты и в нанокаде, и в автокаде работать будут. Но объем писанины там раз в 5-10 больше, чем в скриптах, это уже за пару свободных выходных не осилить. Если такое когда и будет, то это будет тот еще долгострой.
Нубий-IV на форуме  
 
Непрочитано 15.10.2020, 17:47
1 | #16
andsan


 
Регистрация: 24.06.2005
Москва
Сообщений: 290


Цитата:
Сообщение от Техподдержка ЕВРОСОФТ Посмотреть сообщение
Нубий-IV, разработка подойдет для последних версий nanoCAD?
nanoCAD Plus 20.0 - скрипт работатет
andsan вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > JavaScript. nanoCAD 5. Экспорт геометрии в позиционный проект Stark ES

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В каких случаях необходимо разрабатывать ППиМ (проект планировки и межевания) @ndrey Прочее. Архитектура и строительство 6 20.11.2017 11:42
одностадийный или двустадийный проект? ask7777 Прочее. Архитектура и строительство 34 02.09.2010 06:23
Проект КТПП - замена силового трансформатора larpa Инженерные сети 13 01.07.2010 11:13
нужно ли составлять отдельный проект? Irina K. Инженерные сети 4 11.05.2010 21:18
Типовой проект 264-13-82 zebrik Поиск литературы, чертежей, моделей и прочих материалов 0 20.01.2010 22:27