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

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

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

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

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

/**
 * Возвращает значение парметра, записанного в скобках в имени слоя, или 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} WallsMaterial Материал стен
 * @param {Object} BeamsMaterial Материал балок
 * @param {Object} ColumnsMaterial Материал колонн
 * @param {Object} PilesMaterial Материал свай
 */
function StarkPosProject(Scale, SlabsMaterial, WallsMaterial, BeamsMaterial, ColumnsMaterial, PilesMaterial) {
	this.Scale = Scale

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

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

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

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

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

	/**
	 * Возвращает следующий незанятый идентификатор отвертия
	 * @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
	}

	/**
	 * Возвращает идентификатор этажа по индексу в массиве этажей
	 * @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 X = ""
		var Y = ""

		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 + " "
			Y += 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 dr = parseFloat(parseParameter("dr", polyline.Layer))
		if(isNaN(dr))
			dr = 0

		var ds = parseFloat(parseParameter("ds", polyline.Layer))
		if(isNaN(ds))
			ds = 0
	
		var w = parseFloat(parseParameter("w", polyline.Layer))
		if(isNaN(w))
			w = 0
	
		var value =
			"{\r\n" +
			"    Ground =0\r\n" +
			"    Typ =Decke\r\n" +
			"    Geometrie ={\r\n" +
			"      Typ =Polygon\r\n" +
			"      X =" + X + "\r\n" +
			"      Y =" + Y + "\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 =0\r\n" +
			"      p =0\r\n" +
			"      Lasttyp =\r\n" +
			"    }\r\n" +
			"    Generierung ={\r\n" +
			"      Typ =kartesisch\r\n" +
			"      X =0\r\n" +
			"      Y =0\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 =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.AddHorisontalPolylineHole = function (polyline) {
		var id = this.NextHoleId()
		var X = ""
		var Y = ""

		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 + " "
			Y += 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 =" + X + "\r\n" +
			"      Y =" + Y + "\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)
	 */
	this.AddHorisontalPolylineWall = function (polyline) {
		var nSegments = (Utility.CreateSafeArrayFromVector(polyline.Coordinates).ubound() - 1) / 2
		for (var i = 0; i < nSegments; i++) {
			var id = this.NextWallId()

			var vertex1 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(i)).toArray()
			var vertex2 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(i + 1)).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 dr = parseFloat(parseParameter("dr", polyline.Layer))
			if(isNaN(dr))
				dr = 0
	
			var ds = parseFloat(parseParameter("ds", polyline.Layer))
			if(isNaN(ds))
				ds = 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 =0\r\n" +
				"      p =0\r\n" +
				"      Lasttyp =\r\n" +
				"    }\r\n" +
				"    Generierung ={\r\n" +
				"      Typ =kartesisch\r\n" +
				"      X =0\r\n" +
				"      Y =0\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.AddHorisontalPolylineBeam = function (polyline) {
		var nSegments = (Utility.CreateSafeArrayFromVector(polyline.Coordinates).ubound() - 1) / 2
		for (var i = 0; i < nSegments; i++) {
			var id = this.NextBeamId()

			var vertex1 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(i)).toArray()
			var vertex2 = Utility.CreateSafeArrayFromVector(polyline.Coordinate(i + 1)).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.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)
	}

	/**
	 * Возвращает заголовок блока позиций для записи в файл
	 * @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 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.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 polylineIsHorisontalBeam(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 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
}

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

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

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

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

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

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

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

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

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

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

/**
 * Возвращает имя файла, полученное от пользователя
 * @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 = ["CIRCLE,LINE,LWPOLYLINE"]

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 SlabsMaterial =   new Material(0.9e7, 0.2, 2.75)
var WallsMaterial =   new Material(1.8e7, 0.2, 2.75)
var BeamsMaterial =   new Material(0.9e7, 0.2, 2.75)
var ColumnsMaterial = new Material(1.8e7, 0.2, 2.75)
var PilesMaterial =   new Material(1.8e7, 0.2, 2.75)
var posProject = new StarkPosProject(Scale, SlabsMaterial, WallsMaterial, BeamsMaterial, ColumnsMaterial, PilesMaterial)

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

// Экспорт проекта
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()
Если геометрия уже начерчена полилиниями, задать толщины с высотами и экспортировать получается быстрее, чем заново обводить в DxfModel/Poseidon.

Во вложении - пример геометрии.

Миниатюры
Нажмите на изображение для увеличения
Название: ExportPOS.png
Просмотров: 7
Размер:	37.4 Кб
ID:	215113  

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

__________________
Учись долго, умри дураком

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


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


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

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


И в чем собственно вопрос? Или теме место в "Готовых программах"?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.05.2019, 22:04
#4
trir


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


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

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


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

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


Цитата:
Сообщение от румата Посмотреть сообщение
У Старка появился 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
Сообщений: 3,263


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

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

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


Обновил программу в шапке темы. Добавлено:
  • Автоматическое вычисление уровня и высоты этажей на основе геометрии объектов.
  • Возможность задавать дополнительные параметры в имени слоя (см. комментарии в начале скрипта и пример во вложении)
  • Запрос на перезапись файла
Дальнейшую доработку не планирую. Тему можно переносить в готовые программы.
__________________
Учись долго, умри дураком
Нубий-IV вне форума  
Ответ
Вернуться   Форум 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