Forum

Author Topic: Проблемы с Model.volume() и Model.area()  (Read 12873 times)

aldanstar

  • Full Member
  • ***
  • Posts: 137
    • View Profile
    • Александр Старовойтов
Проблемы с Model.volume() и Model.area()
« on: October 01, 2016, 12:23:06 PM »
Здравствуйте, Алексей
Функция Model.volume() и Model.area() работают от раза к разу, т.е. срабатывает не всегда, хотя встроенным инструментом программы вычисляется. Написал скрипт для сохранения линейных компонент, а вот с площадью и объемом беда из-за данного бага.


vol=mod.volume()
ar=mod.area()


Code: [Select]
class lineParam(object):   
    def __init__(self, object):
        self.chunk = object
        print(u"Экспорт размеров")
       
    def export(self):   
        try:
            mod=self.chunk.model
            T = self.chunk.transform.matrix
            saveVol=False
            print(u"ar " +str(ar))
            xo=self.lenghByAxis(mod,T,0)
            print(u"xo " +str(xo))
            yo=self.lenghByAxis(mod,T,1)
            print(u"yo " +str(yo))
            zo=self.lenghByAxis(mod,T,2)
            print(u"zo " +str(zo))
           
            try:
                vol=mod.volume()
                ar=mod.area()
                if  vol==0:
                    PhotoScan.app.messageBox(u"Внимание! Объем равен нулю. Проверьте герметичность модели.")
                saveVol=True
            except IOError:
                print(u"Не могу вычислить объем и площадь")
            path = PhotoScan.app.getExistingDirectory(u"Сохранить параметры")
            paramFile = open(path+"\\"+str(self.chunk.label).split('_', 1)[0]+"_PARAMETERS.txt", 'w+')
            if saveVol==True:
                paramFile.write("V= "+str(round(vol, 4))+" mm^3")
                paramFile.write('\n')
                paramFile.write("S= "+str(round(ar, 4))+" mm^2")
                paramFile.write('\n')
            paramFile.write("x= "+str(round(xo, 4))+" mm")
            paramFile.write('\n')
            paramFile.write("y= "+str(round(yo, 4))+" mm")
            paramFile.write('\n')
            paramFile.write("z= "+str(round(zo, 4))+" mm")
            paramFile.write('\n')
            paramFile.close()
            print(u"Параметры сохранены")
        except IOError:
            print(u"Не удалось сохранить параметры")


    def lenghByAxis(self, mod,T, axis):

        coordinate=mod.vertices[0].coord

        coordinate=T.mulv(coordinate)

       
        min = max = coordinate[axis]
           
        for v in mod.vertices:
            coordinate=v.coord

            coordinate=T.mulv(coordinate)
            if min>coordinate[axis]:
                min = coordinate[axis]
            if max<coordinate[axis]:
                max = coordinate[axis]

        dif = max - min
        return dif
С уважением,
Александр Старовойтов
Казанский (Приволжский) Федеральный Университет

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 15275
    • View Profile
Re: Проблемы с Model.volume() и Model.area()
« Reply #1 on: October 01, 2016, 03:35:23 PM »
Здравствуйте, Александр,

Выдаются ли какие-нибудь сообщения об ошибках в консоль при попытке рассчитать объём и площадь таким образом?
Best regards,
Alexey Pasumansky,
Agisoft LLC

aldanstar

  • Full Member
  • ***
  • Posts: 137
    • View Profile
    • Александр Старовойтов
Re: Проблемы с Model.volume() и Model.area()
« Reply #2 on: October 01, 2016, 03:54:12 PM »
Немножко переделал код и сделал пакетный экспорт, но СУТЬ проблемы НЕ ИЗМЕНИЛАСЬ.
Если вычислить не удается то vol и arимеют значение None. В этом случае записи у меня просто не будет. Повторюсь: при этом вычисления через соответствующий пункт меню программы идет без проблем. Ошибок в консоли нет.

Code: [Select]
class lineParam(object):   
    def __init__(self, object):
        self.chunk = object
        print(u"Экспорт размеров")
       
    def export(self):

        try:
            print(u"Для одного блока")
            path = PhotoScan.app.getExistingDirectory(u"Сохранить параметры")
            paramFile = open(path+"\\"+str(self.chunk.label).split('_', 1)[0]+"_PARAMETERS.txt", 'w+')
            mod=self.chunk.model
            T = self.chunk.transform.matrix
            saveVol=False
            xo=self.lenghByAxis(mod,T,0)
            print(u"xo " +str(xo))
            yo=self.lenghByAxis(mod,T,1)
            print(u"yo " +str(yo))
            zo=self.lenghByAxis(mod,T,2)
            print(u"zo " +str(zo))
           
            try:
                vol=mod.volume()
                ar=mod.area()
                if  vol==0:
                    PhotoScan.app.messageBox(u"Внимание! Объем равен нулю. Проверьте герметичность модели.")
                if vol!=None or ar!=None:
                    saveVol=True
            except IOError:
                print(u"Не могу вычичслить объем и площадь")

            if saveVol==True:
                paramFile.write("V= "+str(round(vol, 4)).replace(".", ",")+" mm^3")
                paramFile.write('\n')
                paramFile.write("S= "+str(round(ar, 4)).replace(".", ",")+" mm^2")
                paramFile.write('\n')
            paramFile.write("x= "+str(round(xo, 4)).replace(".", ",")+" mm")
            paramFile.write('\n')
            paramFile.write("y= "+str(round(yo, 4)).replace(".", ",")+" mm")
            paramFile.write('\n')
            paramFile.write("z= "+str(round(zo, 4)).replace(".", ",")+" mm")
            paramFile.write('\n')
           
            paramFile.close()
           
            print(u"Параметры сохранены")
        except IOError:
            print(u"Не удалось сохранить параметры")
           
    def allexport(self):

        try:

            print(u"Для всех блоков")
            doc = PhotoScan.app.document
            app = QApplication.instance()
            parent = app.activeWindow() 
           
            path = PhotoScan.app.getExistingDirectory(u"Сохранить параметры")
            paramFile = open(path+"\\"+"ALL_PARAMETERS.csv", 'w+')

            #dialog = progressDialog(u"Статус экспорта",parent)
            #dialog.resize(300, 100)
           
            print(u"Создан прогрессбар")

            paramFile.write("Номер образца;X (мм);Y (мм);Z (мм);Объем (мм^3);Площадь (мм^2)")
            paramFile.write('\n')

            for c in doc.chunks:
               
                print(u"Блок " + str(c.label) + u" это " + str(doc.chunks.index(c)+1) +u" блок из " + str(len(doc.chunks)))
                mod=c.model
                T = c.transform.matrix
                xo=self.lenghByAxis(mod,T,0)
                print(u"xo " +str(xo))
                yo=self.lenghByAxis(mod,T,1)
                print(u"yo " +str(yo))
                zo=self.lenghByAxis(mod,T,2)
                print(u"zo " +str(zo))
                saveVol=False
                try:
                    vol=mod.volume()
                    ar=mod.area()
                    if  vol==0:
                        PhotoScan.app.messageBox(u"Внимание! Объем равен нулю. Проверьте герметичность модели.")
                    if vol!=None or ar!=None:
                        saveVol=True
                except IOError:
                    print(u"Не могу вычичслить объем и площадь")
                paramFile.write(str(c.label).split('_', 1)[0]+";"+str(round(xo, 4)).replace(".", ",")+";"+str(round(yo, 4)).replace(".", ",")+";"+str(round(zo, 4)).replace(".", ",")+";")
                if saveVol==True:
                    paramFile.write(str(round(vol, 4)).replace(".", ",")+";"+str(round(ar, 4)).replace(".", ","))
                paramFile.write('\n')

            print(u"Параметры сохранены")

            paramFile.close()
        except IOError:
            print(u"Не удалось сохранить параметры")
 


    def lenghByAxis(self, mod,T, axis):

        coordinate=mod.vertices[0].coord

        coordinate=T.mulv(coordinate)

       
        min = max = coordinate[axis]
           
        for v in mod.vertices:
            coordinate=v.coord

            coordinate=T.mulv(coordinate)
            if min>coordinate[axis]:
                min = coordinate[axis]
            if max<coordinate[axis]:
                max = coordinate[axis]

        dif = max - min
        return dif

Вот данные CSV файла после пакетного сохранения параметров (керна):

Номер образца;X (мм);Y (мм);Z (мм);Объем (мм^3);Площадь (мм^2)
CORE002;64,7449;31,539;31,6422;
CORE001;64,2366;31,03;32,2758;
CORE003;63,3981;31,7091;31,6344;
CORE005;63,6054;31,3906;32,1512;
CORE006;64,1096;31,076;31,0631;
CORE009;63,2876;30,8854;31,1099;
CORE0011;63,3418;31,0886;31,0402;
CORE0012;63,2782;31,3693;31,1193;
CORE008;63,257;30,8895;30,9089;46610,167;7546,184
CORE0013;63,9342;31,9923;31,1513;46989,2956;7576,7966
CORE016;65,3816;32,2372;31,5789;
CORE017;64,6497;31,6619;31,6181;
CORE019;64,2848;31,5466;31,4941;
CORE020;63,8163;31,1824;31,2356;
CORE021;64,2268;31,5619;31,391;
CORE022;63,6909;31,2951;31,1655;
CORE023;63,7445;31,1891;31,216;
CORE026;63,3914;31,0154;30,9986;46934,507;7580,8991
CORE027;63,2671;30,9806;30,9302;46992,7339;7547,7587
CORE028;63,3117;31,0575;31,0525;
CORE029;63,5057;31,3401;31,2398;
CORE030;63,5713;31,2345;31,3314;
CORE031;64,2091;31,3774;31,1929;
CORE32;64,4755;31,3146;31,2655;
CORE25;53,1608;31,0337;30,9371;
CORE033;63,9241;31,0472;31,1537;
CORE034;63,4707;31,1532;31,4789;
CORE035;63,7535;31,0671;31,3062;
CORE036;63,8754;31,4902;31,5228;
CORE037;63,0556;31,0322;31,2188;
CORE038;63,3819;31,3655;31,252;
CORE039;58,2436;31,1316;30,9979;
CORE040;63,0122;31,1409;31,2275;
CORE041;63,0396;31,0196;31,1487;
CORE045;63,0355;30,9402;31,03;
CORE046;62,971;31,0153;30,9464;
CORE049;63,7335;31,135;31,2315;
CORE051;63,3826;31,035;31,1308;
CORE053;63,403;31,2063;31,1389;
CORE054;63,2347;30,9507;30,9675;
CORE055;63,2905;31,2616;30,9598;
CORE056;62,9993;30,9386;31,2494;
С уважением,
Александр Старовойтов
Казанский (Приволжский) Федеральный Университет

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 15275
    • View Profile
Re: Проблемы с Model.volume() и Model.area()
« Reply #3 on: October 01, 2016, 04:03:09 PM »
А есть пример проекта с моделью, где вычисление объёма и площади с помощью скриптов не срабатывает всегда? И пробовали ли Вы просто использовать из консоли PhotoScan.app.document.chunk.model.vol() - какие значения выдаются всегда ли они совпадают со значениями, полученными через интерфейс?

Для поверки того, что объём ненулевой и не None я бы использовал:
Code: [Select]
if not vol:
     print("объём равен нулю или не был рассчитан")
Best regards,
Alexey Pasumansky,
Agisoft LLC

aldanstar

  • Full Member
  • ***
  • Posts: 137
    • View Profile
    • Александр Старовойтов
Re: Проблемы с Model.volume() и Model.area()
« Reply #4 on: October 01, 2016, 04:13:28 PM »
None - это не проверка 0 объема, а проверка его наличия вообще. Проверка на герметичность идет через vol!=0.
Попробовал вашу функцию (там только не vol,а volume), вот итог из консоли:
>>> PhotoScan.app.document.chunk.model.vol()
2016-10-01 16:05:33 Traceback (most recent call last):
2016-10-01 16:05:33   File "<console>", line 1, in <module>
2016-10-01 16:05:33 AttributeError: 'PhotoScan.Model' object has no attribute 'vol'
>>> PhotoScan.app.document.chunk.model.volume()
2016-10-01 16:05:48 Finished processing in 0.296 sec (exit code 1)
2016-10-01 16:05:48 46992.73390448518 - это через функцию
2016-10-01 16:06:21 Finished processing in 0.41 sec (exit code 1)
2016-10-01 16:06:21 Area: 7739.05  - это через меню
2016-10-01 16:06:21 Volume: 47020 - это через меню
>>> PhotoScan.app.document.chunk.model.volume() - нет результатов
2016-10-01 16:06:40 Finished processing in 0.427 sec (exit code 1)
2016-10-01 16:06:40 Area: 7653.5 - это через меню
2016-10-01 16:06:40 Volume: 47465.4 - это через меню
>>> PhotoScan.app.document.chunk.model.volume() - нет результатов


Как видно для CORE27(это название блока) расчитал и так и так, но для CORE29 расчитал только с помощью меню, а PhotoScan.app.document.chunk.model.volume() - неработает
С уважением,
Александр Старовойтов
Казанский (Приволжский) Федеральный Университет

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 15275
    • View Profile
Re: Проблемы с Model.volume() и Model.area()
« Reply #5 on: October 01, 2016, 04:21:01 PM »
Выглядит странно, Вы можете прислать проект, например, с CORE29 на support@agisoft.com? Чтобы в нём была полигональная подель и соответствующая привязка (плотное облако, карты глубины, текстуры - всё это можно удалить)?
Best regards,
Alexey Pasumansky,
Agisoft LLC

aldanstar

  • Full Member
  • ***
  • Posts: 137
    • View Profile
    • Александр Старовойтов
Re: Проблемы с Model.volume() и Model.area()
« Reply #6 on: October 01, 2016, 04:34:25 PM »
Как просили, отправил ссылку на укороченный проект на нашем ftp. Там же папка Agisoft из AppData c моим набором инструментов.
С уважением,
Александр Старовойтов
Казанский (Приволжский) Федеральный Университет

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 15275
    • View Profile
Re: Проблемы с Model.volume() и Model.area()
« Reply #7 on: October 01, 2016, 04:59:06 PM »
Спасибо, Александр, данные скачали.

Похоже, что функции model.volume() и model.area() не срабатывают для непривязанных блоков, даже если они были просто отмасштабированы, и работают только для тех, у которых есть маркировка [R] рядом с названием блока на панели Проект.

Постараемся исправить это в следующем обновлении, в текущей же версии у меня получилось решить это следующим образом:
Code: [Select]
for chunk in PhotoScan.app.document.chunks:
      chunk.transform.matrix = chunk.transform.matrix
      print(chunk.label, chunk.model.volume(), chunk.model.area())
То есть симуляцией привязки.
Best regards,
Alexey Pasumansky,
Agisoft LLC

aldanstar

  • Full Member
  • ***
  • Posts: 137
    • View Profile
    • Александр Старовойтов
Re: Проблемы с Model.volume() и Model.area()
« Reply #8 on: October 01, 2016, 10:15:37 PM »
Спасибо. Проверил удаленно, добавил в пакетный экспорт, все работает. Создал специальную кнопку в моих инструментах, мало ли.
С уважением,
Александр Старовойтов
Казанский (Приволжский) Федеральный Университет

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 15275
    • View Profile
Re: Проблемы с Model.volume() и Model.area()
« Reply #9 on: October 02, 2016, 08:23:12 PM »
Александр, что касается построения ЦМР, то эта опция доступна только для привязанных блоков, т.е. аналогичная операция "псевдо-привязки" должна помочь.
Best regards,
Alexey Pasumansky,
Agisoft LLC