Перейти к публикации

Макросы в Power Mill


Рекомендованные сообщения

@syncomp может поможет мой макрос. Он разбивает 2д модель по диаметрам подписывая диаметр и кол. отв. .Удаляет двойники и конусы. PowerMill 2016

Скрытый текст

ECHO OFF DCPDEBUG UNTRACE COMMAND ACCEPT

DIALOGS ERROR OFF
GRAPHICS LOCK //отключение обновления экрана

//Проверка на наличие активного Featureset
 BOOL $err = 0
 $err = ERROR $entity("Featureset","").Name

    IF $err {
        MESSAGE WARN "2D модель не акивирована!"
        RETURN
    }

	    //Подготовка активного FEATURESET
		EDIT FEATURESET ; DESELECT ALL
		UNDRAW FEATURESET ALL
		DRAW FEATURESET ;
	
	    //фильтр отв. с углом (фаски, конусы, конические отв.)
		real $DraftAngle = 0.5
	    EDIT SELECTION DELETE
		EDIT SELECTION FILTER DRAFT_ANGLE MIN $DraftAngle
		EDIT SELECTION APPLY
		DELETE FEATURESET ; SELECTED


	//список всех диаметров в активном Featureset
	REAL LIST diameters = extract(components(entity('featureset','')), 'Diameter')
	//Удаление дубликатов из $diameters
    int diameDublicate = remove_duplicates(diameters)

STRING $featuresetName = ''
int $HoleDiamCount = 0
string $uline = ''

	IF size(diameters) == 1 {
	
	$HoleDiamCount = size(extract(components(entity('featureset','')), 'Diameter'))
	$featuresetName = "DIAMETER "+ '${round($diameters[0], 2)}' +'_('+ $HoleDiamCount + ')'
	
	//проверка наличия дубликатов
	IF entity_exists('featureset',$featuresetName) {
	
	While entity_exists('featureset',$featuresetName) == 1 {
	$uline = $uline + '_'
	$featuresetName = "DIAMETER "+ '${round($diameters[0], 2)}' +'_('+ $HoleDiamCount + ')'
	$featuresetName = $featuresetName+$uline
	
	}
	
	RENAME FEATURESET ;  $featuresetName
	$uline = ''
	
	} else {
	
	RENAME FEATURESET ; $featuresetName
	$uline = ''
	
	}
	
	} else {
	
    FOREACH $d IN $diameters {
	
		    EDIT SELECTION DELETE
			EDIT SELECTION FILTER DIAMETER MIN $d
			EDIT SELECTION FILTER DIAMETER MAX $d
			EDIT SELECTION APPLY
			//копирование 2D модели с выбранными отв.
			COPY FEATURESET $entity("Featureset","").Name SELECTED
			
			RENAME FEATURESET # '2DHole'
			
			$HoleDiamCount = size(extract(components(entity('featureset','2DHole')), 'Diameter'))

			$featuresetName = "DIAMETER "+$d +'_('+ $HoleDiamCount + ')'
			
			
			//проверка наличия дубликатов
			IF entity_exists('featureset',$featuresetName) {

			While entity_exists('featureset',$featuresetName) == 1 {
			$uline = $uline + '_'
			$featuresetName = $featuresetName+$uline
			}

			RENAME FEATURESET 2DHole  $featuresetName
			$uline = ''

			} else {
			
			RENAME FEATURESET 2DHole $featuresetName
			$uline = ''
			
			}


			}
			
			UNDRAW FEATURESET ALL
			DELETE Featureset ;

}


DIALOGS ERROR On
RESET LOCALVARS // очистить временные переменные
GRAPHICS UNLOCK //включение обновления экрана

 

 

Ссылка на сообщение
Поделиться на других сайтах


03.12.2021 в 09:07, syncomp сказал:

До сих пор мучаюсь с переименованием отверстий!!!

все что вы пишите в чем нуждаетесь - есть в моем макросе для сверления

там и переименование самих отверстий, и переименование наборов отверстий

да и я везде оставил русские комментарии  чтобы было понятно что за что отвечает

советую ознакомиться с ним

03.12.2021 в 11:23, Konstantin_VP сказал:

PowerMill 2016

ну хоть кто-то как и я еще работает в 2016 милле )

03.12.2021 в 11:23, Konstantin_VP сказал:

Удаляет двойники и конусы

конусы удаляет в много-компонентных отверстиях ?

или как и в моем макросе сверления - только в двух-компонентных ?

Ссылка на сообщение
Поделиться на других сайтах
03.12.2021 в 10:07, syncomp сказал:

До сих пор мучаюсь с переименованием отверстий!!! Подсказки eksodus и scorpion1007  не помогли. С форумным кодом разбирался долго. А переменная $featuresetName ничего не дала.

Я не могу получить имя набора отверстий!  Чтобы переименовать каждое отверстие в отдельном наборе, нужно знать его имя. Переименование каждого набора через FOREACH происходит великолепно. Даже получается показать имя! каждого отверстия в активном наборе. Но чтобы переименовать конкретное отверстие в активном наборе нужно знать его имя! И вот с этим проблема. Получить имя стандартным способом не получается. Я подразумеваю, что тип имени string. Но когда определяю переменную с этим типом (STRING fName = featureset.name), то РМ дает ошибку, что тип неправильный! Получить имя инструмента или траектории таким образом можно без проблем.

 

Смотри. Представь список в списке

Чтоб получить доступ ко всем наборам(по-другому спискам( list)) отверстий пробегаешься по папке Featureset

FOREACH f IN FOLDER('Featureset') {

...

}

 

 

 

 

где f это один из элементов списка Featureset. То есть по очереди перебираешь папку по одному элементу

После этого, тебе доступны поля этого элемента. В данном случае наборов(списков) отверстий в папке /Они отделяются точкой

 

2021-12-05_003709.jpg

 

 

то есть имя набора будет $f.name есссно строковое

к Примеру:

string name_nabor=$f.name

 

После этого зная имя набора можешь пробежаться по его компонентам

То же через цикл FOREACH

FOREACH f IN FOLDER('Featureset') {

FOREACH item IN components($f.name)) {

...твой код

}

}

Где из списка набора $f.name ты поучаешь доступ к каждому отверстию набора

И у каждого отверстия тоже есть поля, доступные через точку

 

 

 

то есть $item.name будет именем отверстия string

 

 

2021-12-05_004708.jpg

 

 

 

 

 

a $item.Diameter будет диаметром этого отверстия.

 

 

2021-12-05_005004.jpg

 

 

 

Также доступны и куча других полей отверстий. Имея эти поля можешь их или считывать или модифицировать

в данном случае

$item.name="Vasya" переименует отверстие на Васю

 

Как-то так. Возможны нюансы в синтаксисе, но рыть нужно в этом направлении. Возьми готовый код, что я тебе скидывал и адаптируй под свои нужды

Там синтаксис правильный  

 

Сайт глюканул, последняя картинка повторяется. Не могу удалить

 

2021-12-05_005004.jpg

Изменено пользователем scorpion1007
Ссылка на сообщение
Поделиться на других сайтах

Ессно такая конструкция $item.name="Vasya" не сработает, если в наборе больше чем одно отверстия. Имена отверстий должны быть уникальны,  и милл не даст тебе их переименовать. Нужно организовывать счетчик

//Инициализируешь счетчик для имен набора, если нужно их поменять

int count_nabor=0

//Инициализируешь счетчик для имен отверстий

int count_otv=0

//Перебираешь все наборы

FOREACH f IN FOLDER('Featureset') {

//Переименовываешь наборы, если надо

$f.name=$count_nabor

//Дальше цикл по отверстиям набора. Сначала обнуляешь счетчик имен отверстий перед входом в цикл

$count_otv=0

FOREACH item IN components($f.name)) {

//Переименовываешь отверстие

$item.name=$count_otv+"_"+$item.Diameter+"_mm"

// Увеличиваешь счетчик на 1

$count_otv=$count_otv+1

}

//Увеличиваешь счетчик имен набора, когда вышел из цикла

$count_nabor=$count_naboк+1

}

Как-то так. Возможно надо счетчики(int) и диаметр привести к строке, не помню. А может и так прокатит.

Когда долго не пишешь, подзабывается. Написал один раз и юзаешь год.

В голове уже все перемешиватся, Питон,C#, макросы. У всех свои синтаксисы. Некоторые не дают работать пока не приведешь типы переменных в соответствие друг с другом. Смотри в хелпе

 

Ссылка на сообщение
Поделиться на других сайтах
11 часов назад, scorpion1007 сказал:

Как-то так. Возможно надо счетчики(int) и диаметр привести к строке, не помню. А может и так прокатит.

Всё правильно вы пишете. НО!!! Вы, и многие другие, и руководство по Макропрограммированию советуют получать доступ к имени набора отверстий, как и каждому отверстию из набора через цикл FOREACH!!! Но это неудобно! Мне нужно изменить имя одного набора отверстий. Зачем перебирать все наборы? Предположим: У меня имеются два набора отверстий, 1 и 2. Соответственно набор под именем 1 имеет 16 отверстий диаметром 12мм и набор под именем 2 имеет 4 отверстия диаметром 30мм. Я хочу переименовать набор под именем 1 на новое имя ф12(16). Конструкция переименования будет: RENAME FEATURESET ..? "ф12(16)" Какое значение  какой переменной мне нужно поставить вместо Вопросительного знака? Я нашел как это сделать и написал об этом в конце прошлой страницы. Через INTITY. А получив доступ к имени набора я уже смогу переименовать и все отверстия в наборе, конечно же используя FOREACH Для меня это уже не актуально.

Сейчас ищу способ получить количество отверстий в наборе. Знаю, что нужно использовать SIZE но пока не понял как это сделать . Заинтересовал код Konstantin_VP, но пока его не анализировал. На работе дел много, а дома отдыхаю от РМ

Ссылка на сообщение
Поделиться на других сайтах
04.12.2021 в 15:18, eksodus сказал:

все что вы пишите в чем нуждаетесь - есть в моем макросе для сверления

Он довольно перегружен для восприятия и выделить нужный фрагмент из него сложно, хотя возможно только мне так показалось и нужно было подольше посидеть в отладке.

04.12.2021 в 15:18, eksodus сказал:

ну хоть кто-то как и я еще работает в 2016 милле )

Ну на предприятии есть лицензия данной версии...собственно вот :)

04.12.2021 в 15:18, eksodus сказал:

конусы удаляет в много-компонентных отверстиях ?

или как и в моем макросе сверления - только в двух-компонентных ?

Если отверстие является составным (конус слит с отв), то удаляется весь компонент из набора т.к. не использовал команду разделения.

Но если конус (фаска и / или конус от сверла) не слит с отв, то удаляется просто конус из набора. А полученный итоговый набор разбивается по диаметрам на другие наборы.

Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, syncomp сказал:

Всё правильно вы пишете. НО!!! Вы, и многие другие, и руководство по Макропрограммированию советуют получать доступ к имени набора отверстий, как и каждому отверстию из набора через цикл FOREACH!!! Но это неудобно! Мне нужно изменить имя одного набора отверстий. Зачем перебирать все наборы? Предположим: У меня имеются два набора отверстий, 1 и 2. Соответственно набор под именем 1 имеет 16 отверстий диаметром 12мм и набор под именем 2 имеет 4 отверстия диаметром 30мм. Я хочу переименовать набор под именем 1 на новое имя ф12(16). Конструкция переименования будет: RENAME FEATURESET ..? "ф12(16)" Какое значение  какой переменной мне нужно поставить вместо Вопросительного знака? Я нашел как это сделать и написал об этом в конце прошлой страницы. Через INTITY. А получив доступ к имени набора я уже смогу переименовать и все отверстия в наборе, конечно же используя FOREACH Для меня это уже не актуально.

Сейчас ищу способ получить количество отверстий в наборе. Знаю, что нужно использовать SIZE но пока не понял как это сделать . Заинтересовал код Konstantin_VP, но пока его не анализировал. На работе дел много, а дома отдыхаю от РМ

1)

RENAME FEATURESET "1" "ф12(16)"

2)

ACTIVATE FEATURESET "ф12(16)"

INT kolvo_otv = SIZE(components($entity('FEATURESET','')))

Изменено пользователем scorpion1007
Ссылка на сообщение
Поделиться на других сайтах
05.12.2021 в 23:02, Konstantin_VP сказал:

Он довольно перегружен для восприятия и выделить нужный фрагмент из него сложно

возможно, но вот оттуда этот абзац -

// Деление 2D Элементов на группы по диаметру
	ENTITY $sourceFeatureset = $entity("Featureset","")
	EDIT FEATURESET ; DESELECT ALL
	REAL LIST diameters = {}
	FOREACH $f IN components($sourceFeatureset) {
	IF NOT member($diameters,$f.Diameter) {
	INT $i = add_last($diameters,$f.Diameter)
	   }
	}
	FOREACH $d IN $diameters {
	STRING $featuresetName = "Отверстия D"+$d+" СК_"+$activename
	IF NOT $entity_exists("Featureset",$featuresetName) {
	CREATE FEATURESET $featuresetName
	}
	ACTIVATE FEATURESET $sourceFeatureset
	EDIT FEATURESET ; DESELECT ALL
	FOREACH $f IN components($sourceFeatureset) {
	IF $f.Diameter == $d {
	EDIT FEATURESET ; SELECT $f.Name
	}
	 } 
	 EDIT FEATURESET $featuresetName INSERT FEATURESET ; LAST
	}
	DELETE FEATURESET $sourceFeatureset

 

 

05.12.2021 в 23:02, Konstantin_VP сказал:

Если отверстие является составным (конус слит с отв), то удаляется весь компонент из набора т.к. не использовал команду разделения.

в моем макросе сверления при двухкомпонентном отверстии, (например отверстие плюс фаска, или отверстие плюс цековка) -

удаляется второй компонент и само отверстие продляется на длину второго компонента

// Преобразование составных отверстий в простые (если таковые имеются)
INT subNum = 0
INT comp = 0
DEACTIVATE FEATURESET
FOREACH fsets IN folder ('FeatureSet') {
	FOREACH feat IN components(fsets) {
		IF feat.type == 'hole' {
			IF feat.num_items > 1 {
				FOREACH sub IN components(feat) {
					IF ((sub.Draft < 89) AND (sub.Draft > 1)) OR ((sub.Draft > -89) AND (sub.Draft < -1)) {
						INT subNum2 = $subNum + 1
						REAL depthPrevComp = 0
						ACTIVATE FEATURESET $fsets.name
						EDIT FEATURESET $fsets SELECT $feat.name
						IF subNum > 0 {
							$depthPrevComp = abs(components(components(entity('Featureset', '$fsets.name'))[$comp])[$subNum-1].Depth)
						}
						IF subNum2 < feat.num_items {
							REAL depth = abs(components(components(entity('Featureset', '$fsets.name'))[$comp])[$subNum2].Depth) - $depthPrevComp
							EDIT FEATURESET ; FEATURE SELECTION $subNum2
							EDIT FEATURESET ; FEATURE SELECTED COMPONENT SELECTED DEPTH $depth
						} 
						IF subNum2 == feat.num_items {
							$subNum2 = $subNum2 - $subNum
							REAL depth = 0
							IF feat.num_items > 2 {
								$depth = abs(components(components(entity('Featureset', '$fsets.name'))[$comp])[$subNum].Depth) - abs(components(components(entity('Featureset', '$fsets.name'))[$comp])[0].Depth)
							} ELSE {
								$subNum2 = $subNum2 - 1
								$depth = abs(components(components(entity('Featureset', '$fsets.name'))[$comp])[$subNum].Depth)
							}
							EDIT FEATURESET ; FEATURE SELECTION $subNum2
							EDIT FEATURESET ; FEATURE SELECTED COMPONENT SELECTED DEPTH $depth
						}
						EDIT FEATURESET ; FEATURE SELECTION $subNum
						EDIT FEATURESET ; FEATURE DELETE
						EDIT FEATURESET $fsets.name DESELECT $feat.name
						$subNum = $subNum - 1
					}
					$subNum = $subNum + 1
				}
				$subNum = 0
			}
		}
		IF feat.num_items > 1 {
			ACTIVATE FEATURESET $fsets.name
			REAL depth = abs(components(components(entity('Featureset', '$fsets.name'))[$comp])[1].Depth)
			EDIT FEATURESET $fsets SELECT $feat.name
			EDIT FEATURESET ; FEATURE SELECTION '1'
			EDIT FEATURESET ; FEATURE SELECTED COMPONENT SELECTED DEPTH $depth	
			EDIT FEATURESET ; FEATURE SELECTION '0'
			EDIT FEATURESET ; FEATURE DELETE
			EDIT FEATURESET $fsets.name DESELECT $feat.name
		}
		$comp = $comp + 1
	}
	$comp = 0
}

вроде бы так логичнее, но в принципе, у каждого свои запросы

 

Ссылка на сообщение
Поделиться на других сайтах
10 часов назад, eksodus сказал:

вроде бы так логичнее

согласен, просто мне это не нужно было. 

 

10 часов назад, eksodus сказал:

возможно, но вот оттуда этот абзац -

не спорю, но для внедрения в свой макрос нужно в этом разобраться.

Ссылка на сообщение
Поделиться на других сайтах
07.12.2021 в 12:20, Konstantin_VP сказал:

не спорю, но для внедрения в свой макрос нужно в этом разобраться.

Я так стараюсь и поступать. Первую часть макроса взял за основу. Пока применяю в своих проектах только до создания простых отверстий... Единственное что меня не устраивало так это то, что цвет отверстий остается желтым. Это неудобно. Потому как по умолчанию в РМ этим цветом выделяются отверстия. Но выделив отверстия одного диаметра в созданном наборе, не могу увидеть их визуально. Стал разбираться с кодом. И натолкнулся на такую строку: EDIT FEATURESET ; COLOUR  1,00000 1,00000 0,25000 . Я понимаю, что это формат задания цвета. Но нигде никогда с таким не сталкивался. Единственное, что мог взять за вариант, то это 5 знаков после точки. Типа один из цветов можно представить в диапазоне 0,1-65535 Других вариантов не придумал. Подскажите как понять этот формат?

Ссылка на сообщение
Поделиться на других сайтах
10.12.2021 в 11:41, syncomp сказал:

Я так стараюсь и поступать. Первую часть макроса взял за основу. Пока применяю в своих проектах только до создания простых отверстий... Единственное что меня не устраивало так это то, что цвет отверстий остается желтым. Это неудобно. Потому как по умолчанию в РМ этим цветом выделяются отверстия. Но выделив отверстия одного диаметра в созданном наборе, не могу увидеть их визуально. Стал разбираться с кодом. И натолкнулся на такую строку: EDIT FEATURESET ; COLOUR  1,00000 1,00000 0,25000 . Я понимаю, что это формат задания цвета. Но нигде никогда с таким не сталкивался. Единственное, что мог взять за вариант, то это 5 знаков после точки. Типа один из цветов можно представить в диапазоне 0,1-65535 Других вариантов не придумал. Подскажите как понять этот формат?

Для начала я б попробовал:

string message="Спасибо Konstantin_VP, eksodus, scorpion1007 за подсказки и помощь"

MESSAGE INFO $message

 

Ссылка на сообщение
Поделиться на других сайтах
12.12.2021 в 15:16, scorpion1007 сказал:

Для начала я б попробовал:

string message="Спасибо Konstantin_VP, eksodus, scorpion1007 за подсказки и помощь"

MESSAGE INFO $message

 

Однозначно согласен с Вами. Огромное спасибо за помощь в написании макросов всех. Очень помогают в работе. Всех  с наступающим НГ)))

Даю свой вариант макроса создания и переименования  отверстий. Он основан на коде от eksodus

Создание всех отверстий.mac

Изменено пользователем syncomp
Добавление файла макроса
Ссылка на сообщение
Поделиться на других сайтах
  • 3 недели спустя...

Добрый день. Кто-нибудь пытался вывести все параметры инструмента в УП, к примеру в ToolList ? Суть такая, хочу чтоб CIMCO подтягивала инструмент по всем параметрам из УП, но столкнулся с тем что не могу вывести конические фрезы и дисковые по нужным параметрам. Пробывал через script вывести но не смог обнаружить нужные параметры, а через режим «ЭХО» в самом PoerMill как понял только макрос можно вписать под эти параметры.

Сохраненное изображение 2022-1-8_17-34-1.347.jpg

Сохраненное изображение 2022-1-8_17-41-59.816.jpg

Ссылка на сообщение
Поделиться на других сайтах
08.01.2022 в 15:51, Gexoman сказал:

Добрый день. Кто-нибудь пытался вывести все параметры инструмента в УП, к примеру в ToolList ?

Как я понял вам не хватает параметров длины конической части и диаметра площадки?

Скрытый текст

Создайте в посте пользовательские параметры типа Real с именами udp_TaperDiameter и udp_TaperHeight (регистр важен) и выводите хоть в туллист хоть куда.

Для дисковой верхний радиус udp_TipRadius

Все остальные параметры есть штатно.

Изменено пользователем mannul
Ссылка на сообщение
Поделиться на других сайтах
10.01.2022 в 17:42, mannul сказал:

Как я понял вам не хватает параметров длины конической части и диаметра площадки?

  Скрыть содержимое

Создайте в посте пользовательские параметры типа Real с именами udp_TaperDiameter и udp_TaperHeight (регистр важен) и выводите хоть в туллист хоть куда.

Для дисковой верхний радиус udp_TipRadius

Все остальные параметры есть штатно.

Благодарю за помощь. 
А где можно посмотреть параметры, «команды» для программирования поста ?

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Gexoman сказал:

А где можно посмотреть параметры, «команды» для программирования поста ?

В самом редакторе постпроцессора на вкладке Parameters а так же в справке к посту. Те параметры что я выше писал ни где не найдете, это скрытый функционал.

Ссылка на сообщение
Поделиться на других сайтах
10.01.2022 в 15:42, mannul сказал:

Как я понял вам не хватает параметров длины конической части и диаметра площадки?

  Скрыть содержимое

Создайте в посте пользовательские параметры типа Real с именами udp_TaperDiameter и udp_TaperHeight (регистр важен) и выводите хоть в туллист хоть куда.

Для дисковой верхний радиус udp_TipRadius

Все остальные параметры есть штатно.

День добрый! Подскажи, пожалуйста, как вывести в УП диаметр патрона.

Что-то типа параметра Real с именем udp_НolderDiameter?

Изменено пользователем arsenev
Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, arsenev сказал:

как вывести в УП диаметр патрона.

Что-то типа параметра Real с именем udp_НolderDiameter?

Размеры патрона не передаются в CL-дату по умолчанию. Можете создать в посте параметр с приставкой udp_Имя1, а в PM в параметрах инструмента нужно создать параметр с таким же именем но без udp_ и вписать значение вручную или вписать параметр PM или использовать макрос.

Ссылка на сообщение
Поделиться на других сайтах
  • 4 недели спустя...

Всем доброго дня! PowerMill 2019. Я часто пользуюсь переключением выбора объектов рамкой или курсором. Переключение осуществляется, как мы знаем, в панели инструментов. Но вот что бесит, нельзя просто навести и сразу кликнуть для смены выбора, нужно обязательно выждать секунду времени, пока слева выпадет окошечко с двумя ярлыками. Это неимоверно раздражает))

 

изображение.png

 

Поэтому я записью действий сделал 2 макроса, один из которых включает выбор рамкой, а второй включает выбор курсором. И забиндил на всё это 2 горячие клавиши. Вопрос: как сделать макрос, при запуске которого происходило бы переключение режима с одного на другой, и обратно. Т.е. чтобы можно было использовать всего одну горячую клавишу. Для чего мне это нужно? Всё просто - все удобные места для сочетаний клавиш с Ctrl уже заняты, а до других клавиш тянуться далеко и не удобно)))

Ссылка на сообщение
Поделиться на других сайтах

Можно эти кнопочки на панель быстрого доступа добавить, каждую отдельно, чтобы без макросов обойтись.

Изменено пользователем arsenev
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...